3

複数のリストビューに同じアダプターを使用するのが良い方法かどうか知りたいです。

私のコードには多くのリストビューがあり、それぞれに imageview や textview などの同じ UL コンポーネントが含まれています。それともそれぞれにアダプターを作ったほうがいいですか?

1つのアダプターを使用する必要がある場合、各リストビューのボタン、イメージビュー、およびテキストビューの異なるonclickアクションを処理する方法は?

class MyAdapter extends BaseAdapter {

    public MyAdapter() {
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        return null;
    }

}
4

3 に答える 3

0

いずれにせよ、リストビューごとにアダプタの新しいインスタンスを作成する必要があるため、どちらの方法でもリソースに関しては違いはありません。しかし、2つの異なるアダプターの機能を1つに統合しようとすると、非常に複雑に聞こえます。デザインをわかりやすくするために、2つの異なるアダプターを作成するだけです。デバッグに関しても、長期的にはあなたの生活がとても楽になります。

これは、各リストの動作が異なる場合であることに注意してください。リストが同じように機能することになっている場合は、それぞれに同じアダプターを使用してください。

于 2013-01-23T16:06:08.960 に答える
0

アダプタまたはそのクラスのインスタンスを再利用することについて話しているのですか?クラスは無限に再利用できます。

ただし、インスタンスは再利用しない方が安全です。この理由は、以前のAdapterViewからの衝突またはアーティファクトが発生する可能性があるためです。アダプタの作成は簡単です。安全を確保して、AdapterViewごとに新しいアダプタを作成してみませんか?

于 2013-01-23T16:06:16.707 に答える
0

これは私がしばしば苦労する本当に良い質問です。さまざまなアクションのためだけに多くのアダプターコードを複製する必要はないようです。この質問は設計上の問題としてまだ苦労しているため、私の回答はそれに対する回答を提供することを意図したものではありません。ただし、アダプターを再利用するかどうかに関する質問の一部については、リスト/アダプターを再利用したい場合は次のようにします。

リストの種類ごとに、その種類のリストの識別子として機能するグローバル定数値を作成します。アダプターの新しいインスタンスを作成するときに、requestId/listTypeId をアダプターに提供します。

//first i create the constants somewhere globally
TYPE_ID_A = 0;
TYPE_ID_B = 1;
TYPE_ID_C = 2

//then i feed them to my adapter and set the clickListener on my list
 mList.setAdapter(new MyListAdapter(mContext, listData, TYPE_ID_A));
 mList.setOnItemClickListener(this);

私のアダプターでは、この typeId をメンバー変数として設定し、さらにこの ID を返すパブリック関数を作成します。

public class MyListAdapter extends ArrayAdapter<JSONArray> {

    private final Context mContext;
    private final JSONArray mItems;
    private final int mListType;

    //assign the values in the constructor of the adapter
    public SearchListAdapter(Context context, JSONArray items, int listType) {
        super(context, R.layout.item_filter_list);
        mItems = items;
        mContext = context;
        mListType = listType;
   }

    //function to return the list id
    public int getListType(){
        return mListType;
    }
}

最後に、onClick リスナー内で、アダプター内でこの関数を呼び出して listTypeId を返します。次に、グローバル定数を比較して、さらに何をすべきかを特定します。

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    MyListAdapter adapter = (MyListAdapter) adapterView.getAdapter();
    int listType = adapter.getListType(); //get the listTypeId now

    //now see which list type was clicked:
    switch(listType){
        case(TYPE_ID_A):
          //to action for list A
          break;
        case(TYPE_ID_B):
          //to action for list B
          break;
    }
}

これは私にとってはうまくいきますが、素晴らしいとは思いません。他に適切なデザイン パターンがある場合は、お知らせください。

于 2014-12-09T13:28:47.420 に答える