【问题标题】:Custom ListView has a Button - How to detect which row the button was pressed on? [duplicate]自定义 ListView 有一个按钮 - 如何检测按钮被按下的哪一行? [复制]
【发布时间】:2018-07-06 07:13:52
【问题描述】:

我正在为Android 制作一个库存跟踪应用程序,用于一个练习项目。我使用SQLite 进行存储,我的ListView 使用CursorAdapter 显示数据库的内容。我使用CursorLoader 从数据库中获取数据

我的ListView 中的每一行都有几个TextViews 和一个Button。我打算使用Button 来减少数据库中所选项目的数量列/属性。

在哪里设置按钮OnClick 监听器?在我的Activity 班级或我的CursorAdapter 班级'bindView()

另外,我如何检测按钮单击时按下了哪一行?

我已经使用 ListView 的onItemClickListener 将用户发送到显示有关当前行的更多信息的详细活动。那有一个通过的 id 参数。因此,我找到了一个等效项,可用于我放在每一行上的按钮。

【问题讨论】:

  • 假设在CursorAdapter.

标签: java android listview onclicklistener buttonclick


【解决方案1】:

看下面。我使用自定义适配器添加 onItemClickListener:

private class MyListAdapter(val ctx: Context, val values: List<MyListInformatin>) : ArrayAdapter<MyListInformatin>(ctx, -1, values) {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
         val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val rowView = inflater.inflate(R.layout.item_my_layout, parent, false)
        rowView.setOnClickListener {
            val detailsActivity = Intent(ctx, DetailsActivity::class.java)
            detailsActivity.putExtra(DetailsActivity.ROUTE_NUMBER_PARAM, values.get(position).routeNumber)
            val bundle = Bundle()
            bundle.putParcelable(detailsActivity.ROUTE_NO_STRUCTURE_PARAM, values.get(position).strucutre)
            detailsActivity.putExtra(detailsActivity.PARAM_BUNDLE, bundle)
            ctx.startActivity(detailsActivity)
        }
        return rowView
    }
}

【讨论】:

    【解决方案2】:

    您可以在适配器内创建一个接口,并在此接口中声明一个函数,如 ** void itemClick(int position)** 并在您的活动中实现该接口

    对于 void itemClick(int position) 方法:- 定义它

    holder.setOnClickListener() block like -
    
     viewHolder.button.setOnClickListener(new OnClickListener() {  
    
                @Override  
                public void onClick(View v) {  
                    if (yourInterface != null) {  
                        yourInterface.itemClick(position);  
                    }  
    
                }  
            }); 
    

    详细说明请参考以下链接-

    https://www.c-sharpcorner.com/UploadFile/9e8439/create-custom-listener-on-button-in-listitem-listview-in-a/

    【讨论】:

      【解决方案3】:

      这个问题已经回答过了,你需要将你的列表项设置为不可点击并手动监听onClick按钮事件,详细答案请看这里:Android : How to set onClick event for Button in List item of ListView

      【讨论】:

        【解决方案4】:
        public class MyCustomAdapter extend Adapter {
            private MyOnClickListener mListener;
        
            @Override
            public View getView(int position, View view, ViewGroup parent)
            {
        
                ...
        
                // Your view
                mContainer.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                        mListener.onWholeItemClick(position);
                    }
                });
        
                // Your button
                mButton.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                        mListener.onButtonClick(position);
                    }
                });
            }
        
            public void setListener(MyOnClickListener listener) {
                this.mListener = listener;
            }
        
            // Listener interface
            public interface MyOnClickListener() {
                void onWholeItemClick(int position); // Can pass data as a parametter
                void onButtonClick(int position); 
            }
        }
        
        public class MyActivity extend Activity implement MyOnClickListener() {
            ...
        
            @Override
            public void onCreate(...) {
                mAdapter = new MyCustomAdapter(this);
                mAdapter.setListener(this); // Pass the listener to adapter
            }
        
            @Override
            public void onWholeItemClick(int position) {
                // 
            }
        
            @Override 
            public void onButtonClick(int position) {
                //
            }
        
        }
        

        如何完全处理点击事件

        【讨论】:

          【解决方案5】:

          onBindViewHolder 中为该按钮添加标签。该标签可以是项目的位置或项目本身。 (标签可以是对象)

           override fun onBindViewHolder(holder: ItemHolder, position: Int) {
             CUSTOMMODEL item = items[position];
             ...
             holder.button.setTag(item);
             //OR
             holder.button.setTag(position);
             ...
             holder.button.setOnClickListener(clickListener);
          }
          

          在您的onClick(View view) 方法中,从视图中获取标签,您可以了解点击了哪个项目。

          【讨论】:

            猜你喜欢
            • 2015-10-07
            • 2019-08-15
            • 1970-01-01
            • 2013-10-17
            • 1970-01-01
            • 1970-01-01
            • 2021-03-28
            • 1970-01-01
            相关资源
            最近更新 更多