在游标适配器中使用click事件

时间:2014-06-05 16:14:26

标签: android listview cursor android-cursoradapter

我有一个由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;

以避免出现。

3 个答案:

答案 0 :(得分:3)

name在类中声明,并且每次执行bindView时都会被覆盖,当您单击按钮时,Toast中会显示最近绑定的视图。

我想遵循的模式是将可点击视图的索引存储在其标记中。然后在onClick中从视图中获取索引,并从适配器获取该索引的数据。

答案 1 :(得分:1)

您可以使用setTaggetTag

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