-
Notifications
You must be signed in to change notification settings - Fork 58
/
MyAdapter.java
153 lines (134 loc) · 4.68 KB
/
MyAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package me.kaede.frescosample.recyclerview;
import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.facebook.common.logging.FLog;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.controller.ControllerListener;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.image.ImageInfo;
import com.facebook.imagepipeline.image.QualityInfo;
import me.kaede.frescosample.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by kaede on 2015/10/22.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
int index;
List<String> datas = new ArrayList<>();
Map<String,Integer> heightMap = new HashMap<>();
static Map<String,Integer> widthMap = new HashMap<>();
public MyAdapter(int index) {
this.index = index;
}
public List<String> getDatas() {
return datas;
}
public void setDatas(List<String> datas) {
if (datas!=null&&datas.size()>0){
this.datas.clear();
this.datas.addAll(datas);
notifyDataSetChanged();
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final String url = getDatas().get(position);
if (heightMap.containsKey(url)){
int height = heightMap.get(url);
FLog.i("kaede", url+ "'s height = " + height);
if (height>0){
updateItemtHeight(height,holder.itemView);
holder.draweeView.setImageURI(Uri.parse(url));
return;
}
}
ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
@Override
public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {
if (imageInfo == null) {
return;
}
QualityInfo qualityInfo = imageInfo.getQualityInfo();
if (qualityInfo.isOfGoodEnoughQuality()){
int heightTarget = (int) getTargetHeight(imageInfo.getWidth(),imageInfo.getHeight(),holder.itemView,url);
FLog.i("kaede", "heightTarget = " + heightTarget);
if (heightTarget<=0)return;
heightMap.put(url,heightTarget);
updateItemtHeight(heightTarget, holder.itemView);
}
}
@Override
public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
}
@Override
public void onFailure(String id, Throwable throwable) {
}
};
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(Uri.parse(url))
.setControllerListener(controllerListener)
.setTapToRetryEnabled(true)
.build();
holder.draweeView.setController(controller);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
private float getTargetHeight(float width,float height,View view, String url){
View child = view.findViewById(R.id.draweeview);
float widthTarget;
if (widthMap.containsKey(url)) widthTarget = widthMap.get(url);
else {
widthTarget = child.getMeasuredWidth();
if (widthTarget>0){
widthMap.put(url, (int) widthTarget);
}
}
FLog.i("kaede","child.getMeasuredWidth() = " + widthTarget);
/*int getWidth = child.getWidth();
int getMeasuredWidth = child.getMeasuredWidth();
int getLayoutParamsWidth = child.getLayoutParams().width;
if (getWidth==0||getMeasuredWidth==0||getLayoutParamsWidth==0){
FLog.i("kaede","child.getWidth() = " + getWidth);
FLog.i("kaede","child.getMeasuredWidth() = " + getMeasuredWidth);
FLog.i("kaede","child.getLayoutParams().width = " + getLayoutParamsWidth);
}*/
return height * (widthTarget /width);
}
private void updateItemtHeight(int height, View view) {
CardView cardView = (CardView) view.findViewById(R.id.cardview);
View child = view.findViewById(R.id.draweeview);
CardView.LayoutParams layoutParams = (CardView.LayoutParams) child.getLayoutParams();
layoutParams.height = height;
cardView.updateViewLayout(child,layoutParams);
}
@Override
public int getItemCount() {
return datas.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
SimpleDraweeView draweeView;
public ViewHolder(View itemView) {
super(itemView);
draweeView = (SimpleDraweeView) itemView.findViewById(R.id.draweeview);
}
}
}