当前位置: 首页 > 知识库问答 >
问题:

在光标适配器中使用单击事件

师曦
2023-03-14

我有一个光标适配器显示的项目列表,当我使用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,我想通了,为了使用光标适配器中的单击事件获取列表项的视图,将有问题的按钮设置为cursor.get位置()的标签,因此标签是正确的位置项目,在列表视图生命周期的真正本质中,如果我想要特定位置的项目视图,我会调用

  //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个答案

卫逸春
2023-03-14

您可以创建自己的类来实现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));  
归星驰
2023-03-14

您可以使用setTag和getTag

btn_maybe.setTag(name);

然后在onClick

String value = (String) v.getTag();

使用该值显示toast

Toast.makeText(context, value, Toast.LENGTH_SHORT).show();
陈渊
2023-03-14

在类中声明名称,并在每次执行bindView时覆盖,单击按钮时,最近绑定的视图将显示在Toast中。

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

 类似资料:
  • 考虑一个,下面是它的 双击后,我得到了以下令人费解的结果 而不是预期的 显然,在双击过程中,在所述双击之前单击一次。为什么会这样? rough.java Env: openjdk 15.0.2 2021-01-19 openjdk运行时环境(构建15.0.2 7-27) openjdk 64位服务器虚拟机(构建15.0.2 7-27,混合模式,共享) Windows 10

  • 我是kotlin android的新手。我已经创建了回收站视图的适配器。但是我不能为每个回收站视图项目执行单击事件。我需要参考代码的解释。请帮我做这件事。提前谢谢。这是我的代码供您参考。

  • 我很难用简单的游标适配器从sqlite数据库填充微调器。我必须使用一个简单的游标适配器,而不是数组适配器。我的主要活动、函数和xml文件如下: 功能如下: xml文件在下面; 当我运行应用程序时,将显示以下屏幕。有数据,但似乎是空的。我有_ id,列的名称。 空微调器 谢谢你的帮助。

  • 我有一个带有按钮的视图和一个列表视图,由包含bindView()和newView()的光标适配器支持,用于自定义视图。列表的每一行都包含一个Text和一个复选框。每个视图的数据来自数据库。我正在光标适配器构造函数中传递我的数据库适配器。当复选框被选中或取消选中时,我用它来更新数据库(效果很好)。当然,我对光标运行“重新查询”并view.refreshDrawableState())。这是个好主意吗

  • 问题内容: 我正在将多页php + jquery网站转换为单页角度应用程序。但是我已经用jquery编写了很多代码,因此只打算将php换成与路由等有关的角度。 我遇到的一个我无法弄清楚的问题是,在转换停止工作之前,我一直用尽的jquery click事件。如果更改代码以使其通过ng- click触发,则它将起作用,即使我从控制台调用该函数也是如此。jQuery正常工作,我在提到的函数中放了一些jQ

  • 问题内容: 我正在尝试在matplotlib中实现一个简单的鼠标单击事件。我希望绘制一个图,然后使用鼠标选择积分的上限和下限。到目前为止,我可以将坐标打印到屏幕上,但不能将其存储以供以后在程序中使用。我也想在第二次单击鼠标后退出与该图的连接。 下面是当前绘制并打印坐标的代码。 我的问题: 如何存储图形到列表的坐标?即点击= [xpos,ypos] 是否可以获取两组x坐标以便对该行的该部分进行简单的