我有一个ListView
包含Button
. 该按钮的功能是删除按钮。每当用户单击此按钮时,当前行将被删除。
- 我该怎么做?
- 我该如何设置
onClickListener
这个按钮? - 如何捕获此按钮所在的行 ID?
提前致谢。
我有一个ListView
包含Button
. 该按钮的功能是删除按钮。每当用户单击此按钮时,当前行将被删除。
onClickListener
这个按钮?提前致谢。
在您的自定义适配器类的getView()
buttonDelete.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// Use position parameter of your getView() in this method it will current position of Clicked row button
// code for current Row deleted...
}
});
首先,您可以很容易地处理对该项目的点击。你只需要添加一个监听器:myButton.setOnClickListener(mBuyButtonClickListener)
。此操作通常在getView(...)
您的ListView
.
您的听众可以通过使用 了解按钮的项目位置myListView.getPositionForView(myButton)
。看看这个监听器样本:
private OnClickListener mBuyButtonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
final int position = getListView().getPositionForView(v);
if (position != ListView.INVALID_POSITION) {
//DO THE STUFF YOU WANT TO DO WITH THE position
}
}
};
完成此操作后,您应该无法处理对项目本身的点击和其他一些触摸事件传播。
因此,您应该阅读这篇完整描述在ListView
. 这将非常有帮助。
在适配器类的 getView 方法中使用它。
holder.button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
}
});
我到处看了看,没有一个答案对我有帮助,直到有一个答案。
我所做的是创建一个 HolderView 并将我所有的 textviews 和其他小部件包装在 adpater 的 getView 方法中:
把这个类放在:
static class ViewHolder
{
TextView text1;
TextView text2;
TextView text3;
}
而且我通常也标定了相同的,因为它们现在是分开的:
TextView text1;
TextView text2;
TextView text3;
然后在 getView 中填充布局后声明所有视图和小部件:
holder = new ViewHolder();
holder.text1 = (TextView) vi.findViewById(R.id.textView2single);
holder.text2 = (TextView) vi.findViewById(R.id.textView3single);
holder.text3 = (TextView) vi.findViewById(R.id.textView4single);
在 onClick 方法中,我使用了:
View parentView = (View) v.getParent();
然后使用此父视图再次声明我的所有小部件:
text1 = (TextView) parentView.findViewById(R.id.textView2single);
text2 = (TextView) parentView.findViewById(R.id.textView3single);
text3 = (TextView) parentView.findViewById(R.id.textView4single);
这样做会强制我的 onClick 获取列表视图项的父位置,因此可以轻松调用该父项中的所有小部件,然后您可以使用它做您喜欢的事情。这是我发现的唯一可行的方法。
创建一个新的 View 类型变量并将其分配给 currenView(检查 iit 是否为 null)。定义变量(此处采用 ImageButton)并按下面提到的方式设置 viewId。
public View getView(int position, View convertView, ViewGroup parent) {
View itemview=convertView;
if (itemview==null)
{
itemview=getLayoutInflater().inflate(R.layout.group_list,parent,false);
}
final group_contacts currentcontact=g_contact.get(position);
ImageButton delete=(ImageButton) itemview.findViewById(R.id.imgbtn_delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Add your code here to run on tapping button
}
});
return itemview;
}
要在 a的 a上使用onClickListener()
方法,您必须在的Methode 中的按钮上应用。Button
ListView
onClickListener()
Adapter
getView
但问题是,您将无法从 的position
参数中获取值getView
。
要获取position
您已触摸的按钮,您必须调用getPositionForView()
您的ListView
.
让我们用一个例子来讨论,以便更好地理解,
考虑你有一个ListView
名为ExampleListview
上面有一个Button
名字ExampleButton
,你想onClickListener()
在它上面使用。
Examplebutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final int position= ExampleListview..getPositionForView(v);
/*Where 'v' is actually the 'View' object Which you are clicking.*/
/*you can now right your code her & determine the your desired button by
using the position parameter */
}
创建自定义列表视图适配器,扩展 BaseAdapter 并实现 OnClickListener
public class ListAdapter extends BaseAdapter implements OnClickListener {}
覆盖 getView 方法
@Override
public View getView(int
position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
ViewHolder holder = null;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.b1= (Button) row.findViewById(R.id.b1);
b1.setOnClickListener(this);
else {
holder = (ViewHolder) row.getTag();
}
}
现在覆盖 onclick 方法
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.b1:
//button b1 click event
break;
}
}
public class ViewHolder {
Button b1;
}