1

私はすでにこの問題を解決するために多くの時間を費やしました、私はこのトピックについて他の多くのStackOverflow投稿を見ましたが、私のために働く解決策を見つけることができませんでした。

ListActivityとカスタムArrayAdapterがあります。リストビューには、削除ボタンなど、いくつかのボタンがあります。ただし、onItemClickメソッドは、リストのTextViewがクリックされた場合にのみ呼び出されます。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;
    }

}

誰かがこれに対する最善の解決策を教えてくれたら素晴らしいと思います。

4

3 に答える 3

0

を設定するとOnClickListeners、位置がわかりますButtonsgetView()

于 2012-12-03T16:26:14.443 に答える
0

bt.setText(item.getName())を実行したのと同じように、削除ボタンへの参照を取得して、クリックリスナーをそれに設定しないのはなぜですか。getViewメソッドにクリックリスナーを追加すると、行の位置が自動的に取得されます。

于 2012-12-03T16:26:50.260 に答える
0

これが1つのアプローチです。ビューのタグを設定することは非常に一般的ですが、多くのビューのタグを設定したくない場合は、親を使用してください(可能な場合)。返す変数についてはrow、タグをアイテムに設定しますcurrentItem。それ以外の場合は、クリック可能な各ビューのタグを設定するだけです。

クリックアクションごとに、実際にはクリックリスナーのインスタンスを1つ使用し、ビューの親のタグを確認するだけです。たとえば、View.OnClickListenerレイアウト内の削除ボタンごとに1つのインスタンスを作成します。このonClick()メソッドで、親ビューのタグを確認し、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;
    }

}
于 2012-12-03T16:27:08.043 に答える