Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义ListView有一个按钮-如何检测按钮被按下的行?_Java_Android_Listview_Onclicklistener_Buttonclick - Fatal编程技术网

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

Java 自定义ListView有一个按钮-如何检测按钮被按下的行?,java,android,listview,onclicklistener,buttonclick,Java,Android,Listview,Onclicklistener,Buttonclick,我正在为一个实践项目制作一个适用于Android的库存跟踪应用程序。我使用SQLite进行存储,我的ListView使用CursorAdapter显示数据库的内容。我使用CursorLoader从数据库中获取数据 我的列表视图中的每一行都有一对文本视图和一个按钮。我计划使用按钮减少数据库中所选项目的数量列/属性 我在哪里设置按钮OnClicklistener?在my活动中类或my光标适配器中class'bindView() 另外,我如何从按钮单击中检测按钮被按下的行 我已经使用ListView的

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

我的
列表视图中的每一行都有一对
文本视图
和一个
按钮
。我计划使用
按钮
减少数据库中所选项目的数量列/属性

我在哪里设置按钮
OnClick
listener?在my
活动中
类或my
光标适配器中
class'
bindView()

另外,我如何从按钮单击中检测按钮被按下的行


我已经使用ListView的
onItemClickListener
将用户发送到一个详细的活动,该活动显示有关当前行的更多信息。有一个id参数被传递。所以我找到了一个等价物,我可以用在每一行的按钮上

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

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
    }
}
私有类MyListAdapter(val-ctx:Context,val-values:List):ArrayAdapter(ctx,-1,values){
覆盖视图(位置:Int,转换视图:View?,父视图:ViewGroup?):视图{
val inflater=context.getSystemService(context.LAYOUT\u inflater\u SERVICE)作为LayoutInflater
val rowView=充气机。充气(R.layout.item_my_布局,父项,false)
rowView.setOnClickListener{
val detailsActivity=Intent(ctx,detailsActivity::class.java)
detailsActivity.putExtra(detailsActivity.ROUTE_NUMBER_参数,values.get(position).routeNumber)
val bundle=bundle()
bundle.putParcelable(detailsActivity.ROUTE\u NO\u STRUCTURE\u PARAM,values.get(position.STRUCTURE)
detailsActivity.putExtra(detailsActivity.PARAM_BUNDLE,BUNDLE)
ctx.startActivity(详细活动)
}
返回行视图
}
}

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

对于无效项,请单击(int位置)方法:-在上定义它

holder.setOnClickListener() block like -

 viewHolder.button.setOnClickListener(new OnClickListener() {  

            @Override  
            public void onClick(View v) {  
                if (yourInterface != null) {  
                    yourInterface.itemClick(position);  
                }  

            }  
        }); 
有关详细说明,请参阅以下链接-


此问题已得到回答,您需要将列表项设置为不可单击,并手动侦听按钮的事件,请参见此处的详细答案:


这就是如何在
onBindViewHolder
中完全处理单击事件的方法,为该按钮添加一个标记。该标记可以是项目的位置,也可以是项目本身。(标记可以是对象)


onClick(View-View)
方法中,从视图中获取标记,您可以了解单击了哪个项目。

假设在
CursorAdapter
中。
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) {
        //
    }

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