0
當我嘗試創建一個帶有惰性加載的imageView作爲組視圖的可展開列表視圖時,我遇到了一個不好的問題。它發現每次打開一個組時,所有的組視圖都會重繪,但它們會被賦予一個隨機的convertView(而不是它們的),這會導致非常糟糕的閃爍,因爲之前的imageView會隨機傳送到錯誤的組。您可以通過以下示例來體驗此問題,該示例包含一個非常簡單的帶有延遲組繪製的ExpandableListView,可以非常好地突出顯示這種不需要的行爲。是否有更好的實現可以保留組開口上的項目/ convertView綁定?壞ExpandableListView組查看回收
public class MainActivity extends Activity {
private static final int pad = 20;
private ExpandableListView listView;
private CustomAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
List<GroupItem> items = new ArrayList<GroupItem>();
for (int i = 1; i < 100; i++) {
GroupItem item = new GroupItem();
item.title = "Group " + i;
for (int j = 0; j < i; j++)
item.items.add("Child " + j);
items.add(item);
}
adapter = new CustomAdapter();
adapter.setData(items);
listView = new ExpandableListView(this);
listView.setAdapter(adapter);
listView.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
if (listView.isGroupExpanded(groupPosition)) {
listView.collapseGroup(groupPosition);
} else {
listView.expandGroup(groupPosition);
}
return true;
}
});
setContentView(listView);
}
private static class GroupItem {
String title;
List<String> items = new ArrayList<String>();
}
/**
* Adapter for our list of {@link GroupItem}s.
*/
private class CustomAdapter extends BaseExpandableListAdapter {
private List<GroupItem> items;
public void setData(List<GroupItem> items) {
this.items = items;
}
@Override
public String getChild(int groupPosition, int childPosition) {
return items.get(groupPosition).items.get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
String item = getChild(groupPosition, childPosition);
if (convertView == null)
convertView = new TextView(parent.getContext());
TextView tv = (TextView) convertView;
tv.setPadding(pad, pad, pad, pad);
tv.setBackgroundColor(Color.LTGRAY);
tv.setText(item);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return items.get(groupPosition).items.size();
}
@Override
public GroupItem getGroup(int groupPosition) {
return items.get(groupPosition);
}
@Override
public int getGroupCount() {
return items.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
final GroupItem item = getGroup(groupPosition);
if (convertView == null)
convertView = new TextView(parent.getContext());
final TextView tv = (TextView) convertView;
tv.setPadding(pad, pad, pad, pad);
tv.setBackgroundColor(Color.WHITE);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
tv.setText(item.title);
}
}, 1000);
return convertView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int arg0, int arg1) {
return true;
}
}
}
我真的不認爲這個問題是由缺乏ViewHolders的,我不需要,因爲我的意見沒有反正膨脹引起的。你運行上面的例子嗎? –