ListView作为最常用的控件。其效率也是引人注目的。有时候会出现卡顿的现象。我们可以通过提高listView复用率来提高效率
假设ListView中的子项是Detail类【含有一个TextView和一个Button】。
Datail.java:
public class Detail {
private String textView;
private String button;
// 省略get和set方法
MyAdapter.java:
public class MyAdapter extends ArrayAdapter<Detail> {
private int resource;
public MyAdapter(Context context, int resource, List<Detail> list) {
super(context, resource, list);
this.resource = resource;
}
@Override
public View getView(int position, View converView, ViewGroup viewGroup) {
final Detail detail = this.getItem(position);
View view;
ViewHolder viewHolder;
if (converView == null) {
view = LayoutInflater.from(this.getContext()).inflate(resource, null);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) view.findViewById(R.id.textView);
viewHolder.button = (Button) view.findViewById(R.id.button);
view.setTag(viewHolder);
} else {
view = converView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.textView.setText(detail.getTextView());
viewHolder.button.setText(detail.getButton());
viewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyAdapter.this.remove(detail);
}
});
return view;
}
class ViewHolder {
TextView textView;
Button button;
}
}
重点在于getView()方法。第一个参数肯定没什么要说的,就是指定view的下表。在子项滑出屏幕外,安卓机制会将滑出屏幕外的view缓存与converView中,从而实现view的复用。我们只需要判断converView是否为空,如果为空,说明从未被创建过实例,我们就创建下表为position的实例。如果不为空,则说明已存在该view,我们将converView赋给view即可。至于getTag()和setTag()就是用来管理缓存的。
当然,删除子项也贴出来了。
实现双击回到顶部。可以用ActionBar。我这里就定义了一个TextView,它的id为textView。
在MainAcvtivity.java:
private GestureDetector gestureDetector;
@Override
public void onCreate(Bundle save) {
super.onCreate(save);
setContentView(R.layout.activity_main);
gestureDetector = new GestureDetector(this, new OnDoubleClick());
}
public class OnDoubleClick extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
myAdapter.notifyDataSetChanged();
listView.setSelection(0);
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
实现的效果如下: