我有一个由vursor适配器显示的项目列表,当我使用onItemClick时,我得到正确的行并且能够做我需要的(我的目标是在点击时添加该项目的视图。 现在我需要在单击listView单元格中的按钮时执行此操作。 但是,按钮单击事件不会返回正确的单元格,而是返回列表中随机的其他单元格,这是我的代码中的示例:
public class CustumAdapter extends CursorAdapter implements OnClickListener{
private Context context;
private Button btn_maybe;
private String name;
public CustumAdapter(Context context, Cursor c, LatLng position) {
super(context, c);
this.position = position;
this.context = context;
}
@Override
public void bindView(View view, final Context context, Cursor c) {
name = c.getString(c.getColumnIndex(ContractPlaces.PLACE_NAME));
btn_maybe = (Button) view.findViewById(R.id.cursor_layout_maybe);
btn_maybe.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//i need to use the correct view from BindView here
}
});
nameView.setText(name);
在这个示例代码中,我希望单击单元格中的按钮,让我看看按钮的实际视图,但是我从随机列表单元格中获取视图,如何在单击中获取正确的单元格信息听者?
编辑:
所以感谢@darnmason我想通了,为了使用游标适配器中的click事件获取列表项的视图,设置一个标签,该标签将是cursor.getPosition(),所以标签是项目的正确位置,在listview生命周期的真正本质中,如果我想要在特定位置查看项目,我将调用
//where lv is the ListView (you can pass it to the adapter as a parameter).
//getChildAt returns a view in a position
//value is the value of cursor.getPosition() so its the correct position of the item where //the button was clicked.
//lv.getFirstVisiblePosition() is the first position that is actually on screen,
View view = lv.getChildAt(value - lv.getFirstVisiblePosition());
当你从实际位置扣除这个数据时,你得到了你需要的位置,不要忘记添加
if(view == null)
return;
以避免出现。
答案 0 :(得分:3)
name
在类中声明,并且每次执行bindView
时都会被覆盖,当您单击按钮时,Toast
中会显示最近绑定的视图。
我想遵循的模式是将可点击视图的索引存储在其标记中。然后在onClick中从视图中获取索引,并从适配器获取该索引的数据。
答案 1 :(得分:1)
您可以使用setTag
和getTag
btn_maybe.setTag(name);
然后在onClick
String value = (String) v.getTag();
使用该值显示吐司
Toast.makeText(context, value, Toast.LENGTH_SHORT).show();
答案 2 :(得分:0)
您可以创建自己的类来实现onClickListener并提供对象 构造函数:
private static MyOnClickListener implements OnClickListener {
Context mContext;
String mName;
public MyOnClickListener(Context context, String name) {
mContext = context;
mName = name;
}
@Override
public void onClick(View v) {
Toast.makeText(mContext, mName, Toast.LENGTH_SHORT).show();
}
}
@Override
public void bindView(View view, final Context context, Cursor c) {
name = c.getString(c.getColumnIndex(ContractPlaces.PLACE_NAME));
btn_maybe = (Button) view.findViewById(R.id.cursor_layout_maybe);
btn_maybe.setOnClickListener(new MyOnClickListener(context, name));