具有按钮的自定义Listview的事件监听器

时间:2012-12-03 16:17:15

标签: android android-listview android-arrayadapter

我已经花了很多时间试图解决这个问题,我已经看到很多关于这个主题的其他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;
    }

}

如果有人能告诉我这方面的最佳解决方案,那会很棒。

3 个答案:

答案 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;
    }

}