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