自定义ListView有一个按钮-如何检测按钮被按下的行?

时间:2018-07-06 07:13:53

标签: java android listview onclicklistener buttonclick

我正在为Android开发一个练习项目的广告资源跟踪器应用。我使用SQLite进行存储,而我的ListView使用CursorAdapter显示数据库的内容。我使用CursorLoader从数据库中获取数据

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

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

我又如何从按钮单击中检测按钮被按下的行?

我已经使用ListView的onItemClickListener将用户发送到详细的Activity,该Activity显示有关当前行的更多信息。那有一个id参数被传递。因此,我找到了可以用于每行按钮的等效项。

5 个答案:

答案 0 :(得分:0)

查看以下内容。我使用了自定义适配器来添加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
    }
}

答案 1 :(得分:0)

您可以在适配器内部创建一个接口,并在此接口中声明一个功能,例如** 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/

答案 2 :(得分:0)

此问题已得到解答,您需要将列表项设置为不可点击,并手动收听onClick按钮事件,请在此处查看详细答案:Android : How to set onClick event for Button in List item of ListView

答案 3 :(得分:0)

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) {
        //
    }

}

如何完全处理点击事件

答案 4 :(得分:0)

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)方法中,从视图中获取标签,您可以了解单击了哪个项目。