安卓开发:提供ListView效率,实现双击回到顶部,删除子项

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);
}

实现的效果如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/new_Aiden/article/details/50882000