我有列表视图,每行都有多个可点击区域。在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();
}
});
}
答案 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 ...
}
}
};