Android优化Adapter内的Click、LongClick

来源:互联网 发布:工程网络计划图 编辑:程序博客网 时间:2024/06/04 23:21

通过对convertView设置tag,来保存当前点击的pos

为解决点击item无法获取当前的pos,同时长按点击和点击两个动作,无法再adapter里很好的区分,设计OnConvertViewClickListener继承View.OnClickListener,对convertView和pos保存,pos保存在convertView的tag内,getTag后,回调clickCallback响应点击

public abstract class OnConvertViewClickListener implements View.OnClickListener {    private View convertView;    private int[] positionIds;    public OnConvertViewClickListener(View convertView, int... positionIds) {        this.convertView = convertView;        this.positionIds = positionIds;    }    @TargetApi(Build.VERSION_CODES.DONUT)    @Override    public void onClick(View v) {        int len = positionIds.length;        int[] positions = new int[len];        for (int i = 0; i < len; i++) {            positions[i] = (int) convertView.getTag(positionIds[i]);        }        onClickCallBack(v, positions);    }    public abstract void onClickCallBack(View registedView, int... positionIds);}

同理对longClick也做相同的设置:

public abstract class OnConvertViewLongClickListener implements View.OnLongClickListener {    private View convertView;    private int[] positionIds;    public OnConvertViewLongClickListener(View convertView, int... positionIds) {        this.convertView = convertView;        this.positionIds = positionIds;    }    @Override    public boolean onLongClick(View v) {        int len = positionIds.length;        int[] positions = new int[len];        for (int i = 0; i < len; i++) {            positions[i] = (int) convertView.getTag(positionIds[i]);        }        onLongClickCallBack(v, positions);        return false;    }    public abstract void onLongClickCallBack(View registedView, int... positionIds);}

之后再adapter,调用view.setOnClickListener(new OnConvertViewClickListener(convertView, POSITION) ,其中POSITION是常量,用来保存tag的标识,(注意在getView初始化setTag(POSITION, position),这样才能正确的获取点击pos)

0 0