Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:可重用适配器和不同的onclicklistener_Android_Adapter_Android Adapter_Android Adapterview - Fatal编程技术网

Android:可重用适配器和不同的onclicklistener

Android:可重用适配器和不同的onclicklistener,android,adapter,android-adapter,android-adapterview,Android,Adapter,Android Adapter,Android Adapterview,我想知道对多个listview使用同一适配器是否是一种好方法 在我的代码中,我有许多列表视图,每个列表视图都包含相同的UL组件,比如imageview和textview,所以对它们中的每一个都使用“MyAdapter extends BaseAdapter”好吗?或者最好为每个适配器制作适配器 如果必须使用一个适配器,如何为每个listview处理按钮、imageview和textview的不同onclick操作 class MyAdapter extends BaseAdapter {

我想知道对多个listview使用同一适配器是否是一种好方法

在我的代码中,我有许多列表视图,每个列表视图都包含相同的UL组件,比如imageview和textview,所以对它们中的每一个都使用“MyAdapter extends BaseAdapter”好吗?或者最好为每个适配器制作适配器

如果必须使用一个适配器,如何为每个listview处理按钮、imageview和textview的不同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;
    }

}

无论采用哪种方式,在资源方面都不会有任何区别,因为您无论如何都必须为每个listview创建一个新的适配器实例。但是,试图将两个不同适配器的功能合并到一个适配器中,听起来甚至过于复杂。我想说,为了设计的清晰,只需制作两个不同的适配器。从长远来看,当涉及到调试时,它将使您的生活变得更加轻松


请记住,当每个列表的行为不同时,如果列表的功能相同,请继续操作,并为每个列表使用相同的适配器。

您是说重用适配器实例还是它的类?该类可以在内部重用


但是,不重用实例更安全。这样做的原因是您可能会有来自上一个AdapterView的冲突或工件。适配器的创建很简单,所以为什么不安全地为每个AdapterView创建一个新的适配器呢?

这是我经常遇到的一个非常好的问题。似乎没有必要为了不同的操作复制这么多适配器代码。作为一个设计问题,我仍然在努力解决这个问题,所以我的回答并不打算提供关于这个问题的答案。但是,对于问题中关于是否重用适配器的部分,如果我希望重用列表/适配器,我将执行以下操作:

对于每种类型的列表,我创建一个全局常量值作为该类型列表的标识符。创建适配器的新实例时,我向适配器提供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;
    }
}
公共类MyListAdapter扩展了ArrayAdapter{
私有最终上下文mContext;
私人最终JSONArray mItems;
私有最终整数mListType;
//在适配器的构造函数中指定值
公共SearchListAdapter(上下文上下文、JSONArray项、int listType){
超级(上下文、右布局、项目过滤器列表);
mItems=项目;
mContext=上下文;
mListType=listType;
}
//函数返回列表id
public int getListType(){
返回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;
    }
}
@覆盖
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
MyListAdapter=(MyListAdapter)adapterView.getAdapter();
int listType=adapter.getListType();//立即获取listTypeId
//现在查看单击的列表类型:
开关(列表类型){
案例(类型_ID _A):
//为列表A执行操作
打破
案例(类型_ID _B):
//为清单B采取行动
打破
}
}

这对我来说很有用,但我觉得不太好。如果任何一个有另一个适当的设计模式,请让我们知道

我说的是重用这个类,我也知道为每个listview创建一个新的适配器更容易,但我的意思是知道标准方法是的,可以多次使用包含相同UI组件的相同适配器,并且您可以自己管理onclick。只需根据按钮、imageview等的不同onclick操作想要实现的功能,自己思考一下。onclick必须位于getview内部,那么如何在单击时做出不同的操作呢?