ListView的几种优化方式
convertView的复用
第一种优化就是重用convertView,这也是最简单的一种优化方式,就是在Adapter类的getView方法中通过判断convertView是否为null,是的话就需要在创建一个视图出来,然后给视图设置数据,最后将这个视图返回给底层,呈现给用户;如果不为null的话,其他新的view可以通过复用的方式使用已经消失的条目view,重新设置上数据然后展现出来。
ViewHolder的使用
第一种优化方式有个缺点,就是每次在findviewById,重新找到控件,然后对控件进行赋值,这样会减慢加载的速度,其实我们可以创建一个内部类ViewHolder,里面的成员变量和view中所包含的组件个数、类型相同,在convertview为null的时候,把findviewbyId找到的控件赋给ViewHolder中对应的变量,就相当于先把它们装进一个容器,下次要用的时候,直接从容器中获取,这样是不是比findviewbyId效率要高一点?
使用分段加载
使用分页记载
##要了解RecycleBin机制: android-----带你一步一步优化ListView(一)
1和2参考一下代码:
public class SearchHistoryAdapter extends ArrayAdapter<String> {
private int resourceId;
private List<String> list;
private HistoryClickInterface historyClickInterface;
SearchHistoryAdapter(@NonNull Context context, int resource, @NonNull List<String> list) {
super(context, resource, list);
this.resourceId = resource;
this.list = list;
}
public void HistorySetOnclick(HistoryClickInterface historyClickInterface) {
this.historyClickInterface = historyClickInterface;
}
public interface HistoryClickInterface {
void clickItem(View view, int position);
void clickDelete(View view, int position);
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
viewHolder = new ViewHolder();
viewHolder.historyItem = (TextView) view.findViewById(R.id.history_item);
viewHolder.deleteBtn = (LinearLayout) view.findViewById(R.id.delete_btn);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.historyItem.setText(list.get(position));
LinearLayout itemLayout = (LinearLayout) view.findViewById(R.id.item_layout);
itemLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (historyClickInterface != null) {
historyClickInterface.clickItem(v, position);
}
}
});
viewHolder.deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (historyClickInterface != null) {
historyClickInterface.clickDelete(v, position);
}
}
});
return view;
}
class ViewHolder {
TextView historyItem;
LinearLayout deleteBtn;
}
}