Listview - onClickListener的onClick调用了重用视图

时间:2014-02-19 17:04:20

标签: android android-listview android-adapter android-event android-adapterview

我有列表视图,每行都有多个可点击区域。在bindView(我使用CursorAdapter)中,我为每个可点击区域设置onClickListener,一切正常。

单击视图时出现问题,同时调用notifyDataSetChanged(或更改游标)

似乎当我单击第一个项目时,但在调用OnClickListener之前,将重新使用视图(对于第二个项目调用bindView),并在第二个项目上调用onClickListener。 我唯一的想法是在触发触发之后但在调用onClickListener之前重用视图。知道怎么解决它或者什么可能是错的?

编辑:如果点击的视图在内可滚动,则onTouch和onClick 之间会有180ms的延迟,以确定是单击还是滚动。因此,如果在onTouch和onClick之间重用视图,则会在重用(错误)行上调用onClick。

使用OnLongClickListener几乎可以更容易地重现。

@Override
  public void bindView(View view, Context context, Cursor cursor) {
         View clickableView = view.findViewById(R.id.clickable_view);
         clickableView.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 final int position = getListView().getPositionForView(v);
                 if (position != ListView.INVALID_POSITION) {
                      //it display position 2 even when I clicked at position 1
                     Toast.makeText(getContext(), "Position " + position, Toast.LENGTH_SHORT).show();
                 }
         });
  }

1 个答案:

答案 0 :(得分:0)

您可能希望将onClickListener设为私有。

    public View newView(Context context, Cursor cursor, ViewGroup parent) {
    ViewHolder holder = new ViewHolder();
    View view = inflater.inflate(R.layout.yourrow, parent, false);


    holder.your_textview = (TextView) view.findViewById(R.id.tv_your_textviewfield);
    holder.your_textview.setOnClickListener(mMoves_OnClickListener);
    holder.position = cursor.getPosition();
    bindView(view, context, cursor);
    view.setTag(holder);
    return view;
}

private OnClickListener mMoves_OnClickListener = new OnClickListener() {
    public void onClick(View v) {

        ViewHolder holder = (ViewHolder) ((View) v.getParent()).getTag();

        switch (v.getId()) {
        case R.id.tv_your_textviewfield:
            ((OnMoveScoreSelectedListener) context).onMoveScoreClickSelected();
            break;
        case ...
        }
    }
};