我已经花了很多时间试图解决这个问题,我已经看到很多关于这个主题的其他StackOverflow帖子,但我找不到适合我的解决方案。
我有一个ListActivity和一个自定义ArrayAdapter。我的列表视图中有几个按钮,例如删除按钮。但是,只有单击列表的TextView时才会调用onItemClick方法。我可以在按钮上添加OnClickListeners,但是我遇到的问题是我不知道按钮所属元素的位置。我知道我可以为每个按钮设置标签,但必须有更好的方法来做到这一点!
这是我的适配器:
private class ItemListAdapter extends ArrayAdapter<Item> {
private ArrayList<Item> items;
private int countItems = 0;
public ItemListAdapter(Context ctx, int textViewResourceId, ArrayList<Item> itemList){
super(ctx, textViewResourceId, itemList);
this.items = itemList;
this.countItems = itemList.size();
}
public int getCount(){
return countItems;
}
public Item getItem(int pos){
return itemList.get(pos);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
//Get the current list item
final Item currentItem = itemList.get(position);
if (row == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = vi.inflate(R.layout.itemlist_item_row, null);
}
Item item = items.get(position);
if (item != null){
TextView bt = (TextView) row.findViewById(R.id.bt_itemlist_item);
if (bt != null){
bt.setText(item.getName());
}
}
return row;
}
}
如果有人能告诉我这方面的最佳解决方案,那会很棒。
答案 0 :(得分:0)
在OnClickListeners
中为Buttons
设置getView()
,您将获得职位
答案 1 :(得分:0)
就像你使用bt.setText(item.getName())一样,为什么不能获得对删除按钮的引用,然后将on click侦听器设置为它。 您将在getView方法中添加on click侦听器,您将自动获取该行的位置。
答案 2 :(得分:0)
这是一种方法。设置View的标记非常常见,但如果您不想设置许多视图的标记,只需使用父标记(如果可能)。对于您返回的变量row
,请将标记设置为您的项currentItem
。否则,只需设置每个可点击视图的标记。
对于每个点击操作,您实际上可以使用单击侦听器的1个实例,只需检查视图父级的标记即可。例如,为布局中的每个删除按钮创建一个View.OnClickListener
实例。在onClick()
方法中,检查父View的标记,并获取应删除的Item
实例。
private class ItemListAdapter extends ArrayAdapter<Item>
{
View.OnClickListener deleteListener = new View.OnClickListener()
{
@Override
public void onClick(View view)
{
View parent = (View)view.getParent();
Item item = (Item)parent.getTag();
//Do something with "item"
}
};
//Remainder omitted
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
//Remainder omitted
row.setTag(currentItem);
View deleteButton; //find this somewhere in your layout
deleteButton.setOnClickListener(deleteListener);
return row;
}
}