Skip to content

Commit 721d265

Browse files
committed
add view cache
1 parent 9db6325 commit 721d265

3 files changed

Lines changed: 54 additions & 49 deletions

File tree

demo/src/main/java/com/uis/stackview/demo/activity/MainActivity.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import android.content.Intent;
44
import android.net.Uri;
55
import android.os.Bundle;
6+
import android.util.Log;
67
import android.view.LayoutInflater;
78
import android.view.View;
89
import android.view.ViewGroup;
910
import android.widget.Toast;
1011

1112
import com.bumptech.glide.Glide;
13+
import com.google.gson.Gson;
1214
import com.uis.stackview.StackLayout;
1315
import com.uis.stackview.demo.R;
1416
import com.uis.stackview.demo.entity.ItemEntity;
@@ -44,7 +46,7 @@ protected void onCreate(Bundle savedInstanceState) {
4446
stackViewLayout.setAdapter(new StackLayout.StackAdapter() {
4547
@Override
4648
public View onCreateView(ViewGroup parent) {
47-
return LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,parent,false);
49+
return LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,null);
4850
}
4951

5052
@Override
@@ -55,7 +57,7 @@ public void onBindView(View view, int position) {
5557
viewHolder.imageView = view.findViewById(R.id.imageView);
5658
view.setTag(viewHolder);
5759
}
58-
//Log.e("xx","binderVH: " + position + ",data: " + new Gson().toJson(dataList.get(position)));
60+
Log.e("xx","binderVH: " + position + ",data: " + new Gson().toJson(dataList.get(position)));
5961
Glide.with(view.getContext())
6062
.load(dataList.get(position).getCoverImageUrl()).into(viewHolder.imageView);
6163
}

demo/src/main/res/layout/activity_main.xml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,6 @@
66
android:background="#fff"
77
android:orientation="vertical">
88
<include layout="@layout/stack_right"/>
9-
<androidx.recyclerview.widget.RecyclerView
10-
android:id="@+id/recyclerView"
11-
android:layout_width="match_parent"
12-
android:layout_height="match_parent">
13-
14-
</androidx.recyclerview.widget.RecyclerView>
159

1610
<Button android:id="@+id/bt_web"
1711
android:layout_width="match_parent"
@@ -26,4 +20,13 @@
2620
android:visibility="gone"
2721
/>
2822

23+
<androidx.recyclerview.widget.RecyclerView
24+
android:id="@+id/recyclerView"
25+
android:layout_width="match_parent"
26+
android:layout_height="match_parent">
27+
28+
</androidx.recyclerview.widget.RecyclerView>
29+
30+
31+
2932
</LinearLayout>

library/src/main/java/com/uis/stackview/StackLayout.java

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
import android.view.animation.DecelerateInterpolator;
1717
import android.view.animation.Interpolator;
1818
import android.widget.FrameLayout;
19+
import android.widget.LinearLayout;
1920
import android.widget.Scroller;
2021

2122
import com.stone.pile.libs.R;
2223

2324
import java.util.ArrayList;
25+
import java.util.LinkedList;
2426
import java.util.List;
2527

2628
/**
27-
* Created by xmuSistone on 2017/5/12. com.stone.pile.libs.PileLayout
2829
* @author uis 2018/10/30
2930
*/
3031

@@ -62,6 +63,7 @@ public class StackLayout extends ViewGroup implements ViewTreeObserver.OnGlobalL
6263
private Interpolator interpolator = new DecelerateInterpolator(1.6f);
6364
private StackAdapter adapter;
6465
private boolean hasSetAdapter = false;
66+
private LinkedList<View> views = new LinkedList<>();
6567
private FrameLayout animatingView;
6668
private VelocityTracker mVelocity;
6769

@@ -109,18 +111,25 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
109111
int realSize = getRealStackSize();
110112
everyWidth = width - getPaddingLeft() - getPaddingRight() - stackSpace *(realSize-1) - 2*stackEdge;
111113
everyHeight = height;
112-
originX.add(stackEdge);
114+
//originX.add(stackEdge);
113115
originX.add(stackEdge);
114116
for(int i = 1; i < realSize; i++){
115-
originX.add(originX.get(i) + stackSpace);
117+
originX.add(originX.get(i-1) + stackSpace);
116118
}
117-
originX.add(width);
119+
//originX.add(width);
118120
}
119121
}
120122

123+
boolean isLayout = false;
124+
121125
@Override
122126
protected void onLayout(boolean changed, int l, int t, int r, int b) {
123127
Log.e("xx","onLayout....");
128+
if(!hasSetAdapter || isLayout){
129+
return;
130+
}
131+
Log.e("xx","onLayout....again");
132+
isLayout = true;
124133
for (int i = 0, size = getChildCount(); i < size; i++) {
125134
View itemView = getChildAt(i);
126135
itemView.measure(everyWidth, everyHeight);
@@ -140,7 +149,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) {
140149
itemView.setPivotX(pivot);
141150
itemView.setPivotY(everyHeight / 2);
142151
itemView.layout(left, top, right, bottom);
143-
if (i < size - 2) {
152+
if (i < size - 1) {
144153
adjustScale(i, itemView);
145154
}
146155
}
@@ -150,25 +159,20 @@ private int getRealStackSize(){
150159
return adapter.getItemCount() < stackSize ? adapter.getItemCount() : stackSize;
151160
}
152161

153-
private void initAdapterView(){
154-
Log.e("xx","initAdapterview start....");
155-
if (adapter != null && getChildCount() == 0 && adapter.getItemCount() > 0) {
156-
hasSetAdapter = true;
157-
for (int i = 0,size = getRealStackSize() + 2; i < size; i++) {
158-
FrameLayout frameLayout = new FrameLayout(getContext());
159-
View view = adapter.onCreateView(frameLayout);
160-
FrameLayout.LayoutParams lp1 = new FrameLayout.LayoutParams(everyWidth, everyHeight);
161-
frameLayout.addView(view, lp1);
162-
addView(frameLayout);
163-
}
164-
162+
private void addView(int index){
163+
Log.e("xx","addView start....");
164+
if (adapter != null && adapter.getItemCount() > 0){
165+
FrameLayout frameLayout = new FrameLayout(getContext());
166+
View view = adapter.onCreateView(this);
167+
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(everyWidth, everyHeight);
168+
frameLayout.addView(view,params);
169+
addView(frameLayout,index < 0 ? -1 :index);
165170
}
166171
}
167172

168173
private void adjustScale(int index,View itemView) {
169-
int rate = getRealStackSize() - (index <= 1 ? 1: index);
174+
int rate = getRealStackSize() -1 - index;
170175
float scale = (float) Math.pow(1.0f - stackZoom,rate);
171-
itemView.setScaleX(1.0f - stackZoom);
172176
itemView.setScaleY(scale);
173177
}
174178

@@ -190,34 +194,22 @@ public void setAdapter(StackAdapter adapter) {
190194
*/
191195
private void doBindAdapter() {
192196
if(adapter != null && !hasSetAdapter){
193-
initAdapterView();
197+
hasSetAdapter = true;
198+
for (int i = 0,size = getRealStackSize(); i < size; i++){
199+
addView(i);
200+
}
194201
doBindAdapterData();
195202
}
196203
}
197204

198205
private void doBindAdapterData(){
199-
int size = getRealStackSize();
200-
FrameLayout frameLayout;
201-
for (int i = 0; i < size + 2; i++) {
202-
frameLayout = (FrameLayout) getChildAt(i);
203-
adapter.onBindView(frameLayout.getChildAt(0),getRealIndex(size,i));//size-1-i
204-
}
205-
}
206-
207-
private int getRealIndex(int size,int index){
208206
int count = adapter.getItemCount();
209-
int real;
210-
//底层
211-
if(0 == index){
212-
real = count > size ? size : 0;
213-
}//顶层
214-
else if(size+1 == index){
215-
real = count - 1;
216-
}//中间层
217-
else{
218-
real = size - index;
207+
int size = getChildCount();
208+
for (int i = 0; i < size; i++) {
209+
View view = getChildAt(i);
210+
adapter.onBindView(view,size-1-i);//size-1-i
211+
219212
}
220-
return real;
221213
}
222214

223215
@Override
@@ -296,9 +288,17 @@ private void requestParentDisallowInterceptTouchEvent(boolean disallowIntercept)
296288

297289
public void computeScroll(int dx) {
298290
//dx<0 left, dx>0 right
299-
for (int i = 3,size = 2 + getRealStackSize(); i < size; i++) {
291+
for (int size = getChildCount(),i = size-1; i < size; i++) {
300292
View itemView = getChildAt(i);
301293
itemView.setTranslationX(itemView.getTranslationX() + dx);
294+
if(size == 3) {
295+
Log.e("cc","remove...");
296+
removeViewAt(0);
297+
}else if(size == 2){
298+
isLayout = false;
299+
addView(2);
300+
}
301+
302302
}
303303
}
304304

0 commit comments

Comments
 (0)