Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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
Java Android使用适配器将两个不同类型的ArrayList显示为一个无缝列表视图_Java_Android_Android Listview_Android Arrayadapter_Android Adapter - Fatal编程技术网

Java Android使用适配器将两个不同类型的ArrayList显示为一个无缝列表视图

Java Android使用适配器将两个不同类型的ArrayList显示为一个无缝列表视图,java,android,android-listview,android-arrayadapter,android-adapter,Java,Android,Android Listview,Android Arrayadapter,Android Adapter,我有一个基类的自定义ArrayAdapter。我还有一个子类,我希望ArrayAdapter能够接收两种不同类型的数据,即(arrayList和arrayList),并在一个无缝列表视图中连续显示它们 我以前从未这样做过,因此非常感谢一般性意见和指导方针。我试图使ArrayAdapter通用: public class MyAdapter<T extends BaseClass> extends ArrayAdapter<T> 公共类MyAdapter扩展了ArrayA

我有一个基类的自定义
ArrayAdapter
。我还有一个子类,我希望
ArrayAdapter
能够接收两种不同类型的数据,即(arrayList和arrayList),并在一个无缝
列表视图中连续显示它们

我以前从未这样做过,因此非常感谢一般性意见和指导方针。我试图使ArrayAdapter通用:

public class MyAdapter<T extends BaseClass> extends ArrayAdapter<T>
公共类MyAdapter扩展了ArrayAdapter
使用此构造函数:

public MyAdapter(Context context, ArrayList<T> items) {
        super(context, 0, items);
        fullList = items;  
    }
公共MyAdapter(上下文、ArrayList项){ 超级(上下文,0,项); 完整列表=项目; }
但我不知道如何传递一个可以具有类型子类或基类的泛型ArrayList。(这种方法稍后将涉及使用instanceOf的代码,这不是做事情的最佳方式……正如我从中了解到的)

我想扩展这个定制的
arrayadapter
本身,而不是泛型。但我不确定这将如何运作

最好的方法是什么?除了
arrayadapter
之外,是否还有更适合这种情况的适配器。或者,
recyclerview
有解决这个问题的方法吗


我最终希望有两个相似但不同类型的数据集(一个是另一个子类),作为一个无缝的listview输出。我找不到执行此操作的一般方法。

您在ArrayList中使用的数据类型是什么

例如,如果是字符串和整数,您能否将这些值转换并合并到单个ArrayList中

for (int i=0; i<arraylist1.size(); i++) { //arraylist1 containing integers

arraylist2.add(Integer.toString(arraylist1.get(i));

}

for(int i=0;i可以使用视图类型解决此问题

例如:

row_type_one.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtTypeOne"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>
YourTypeTow.java

public class YourTypeTow {
    public String title;
    public String imgUrl;
}
YourAdapter.java

public class YourAdapter extends RecyclerView.Adapter<YourAdapter.YourViewHolder> {

    ArrayList<Object> objects = new ArrayList<>();

    public YourAdapter(ArrayList<YourTypeOne> typeOneArray, ArrayList<YourTypeTow> typeTowArray) {
        objects.addAll(typeOneArray);
        objects.addAll(typeTowArray);
    }

    @Override
    public int getItemViewType(int position) {
        return objects.get(position) instanceof YourTypeOne ? 1 : 2;
    }

    @NonNull
    @Override
    public YourViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v;
        if (viewType == 1) {
            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_type_one, parent, false);
        } else {
            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_type_two, parent, false);
        }
        return new YourViewHolder(v,viewType);
    }

    @Override
    public void onBindViewHolder(@NonNull YourViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return objects.size();
    }

    class YourViewHolder extends RecyclerView.ViewHolder {

        private TextView txtTypeOne;

        private TextView txtDescription;
        private ImageView logo;


        public YourViewHolder(@NonNull View itemView, int vewType) {
            super(itemView);

            if (vewType==1){
                //find views by ides in .xml
                txtTypeOne =  itemView.findViewById(R.id.txtTypeOne);
            }else {
                //find views by ides in row_type_two.xml
                txtDescription =  itemView.findViewById(R.id.txtDescription);
                logo = itemView.findViewById(R.id.logo);
            }
        }


        public void bindeData(Object object){

            if (object instanceof YourTypeOne){
                //set data to layout row_type_one
            }else {
                //set data to layout row_type_two
            }

        }


    }
}
public类YourAdapter扩展了RecyclerView.Adapter{
ArrayList对象=新的ArrayList();
公共适配器(ArrayList typeOneArray、ArrayList typeTowArray){
addAll(typeOneArray);
addAll(typeTowArray);
}
@凌驾
public int getItemViewType(int位置){
返回对象。获取TypeOne的(位置)实例?1:2;
}
@非空
@凌驾
public YourViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int viewType){
观点五;
如果(viewType==1){
v=LayoutInflater.from(parent.getContext())
.充气(R.layout.row\u type\u one,父级,假);
}否则{
v=LayoutInflater.from(parent.getContext())
.充气(R.layout.row\u type\u two,父级,假);
}
返回新的YourViewHolder(v,viewType);
}
@凌驾
public void onBindViewHolder(@NonNull YourViewHolder,int位置){
}
@凌驾
public int getItemCount(){
返回objects.size();
}
类YourViewHolder扩展了RecyclerView.ViewHolder{
私有文本视图txtTypeOne;
私有文本视图txtDescription;
私人影像视图标识;
public YourViewHolder(@NonNull View itemView,int-vewType){
超级(项目视图);
如果(vewType==1){
//通过IDE在.xml中查找视图
txtTypeOne=itemView.findViewById(R.id.txtTypeOne);
}否则{
//按IDE在row_type_two.xml中查找视图
txtDescription=itemviewbyd(R.id.txtDescription);
logo=itemView.findviewbyd(R.id.logo);
}
}
公共void bindeData(对象){
if(typeOne的对象实例){
//将数据设置为布局行类型
}否则{
//将数据设置为布局行\类型\二
}
}
}
}

祝你好运。:)

不太可能。数据类型是我自己的自定义基类和另一个子类
public class YourTypeTow {
    public String title;
    public String imgUrl;
}
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.YourViewHolder> {

    ArrayList<Object> objects = new ArrayList<>();

    public YourAdapter(ArrayList<YourTypeOne> typeOneArray, ArrayList<YourTypeTow> typeTowArray) {
        objects.addAll(typeOneArray);
        objects.addAll(typeTowArray);
    }

    @Override
    public int getItemViewType(int position) {
        return objects.get(position) instanceof YourTypeOne ? 1 : 2;
    }

    @NonNull
    @Override
    public YourViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v;
        if (viewType == 1) {
            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_type_one, parent, false);
        } else {
            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_type_two, parent, false);
        }
        return new YourViewHolder(v,viewType);
    }

    @Override
    public void onBindViewHolder(@NonNull YourViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return objects.size();
    }

    class YourViewHolder extends RecyclerView.ViewHolder {

        private TextView txtTypeOne;

        private TextView txtDescription;
        private ImageView logo;


        public YourViewHolder(@NonNull View itemView, int vewType) {
            super(itemView);

            if (vewType==1){
                //find views by ides in .xml
                txtTypeOne =  itemView.findViewById(R.id.txtTypeOne);
            }else {
                //find views by ides in row_type_two.xml
                txtDescription =  itemView.findViewById(R.id.txtDescription);
                logo = itemView.findViewById(R.id.logo);
            }
        }


        public void bindeData(Object object){

            if (object instanceof YourTypeOne){
                //set data to layout row_type_one
            }else {
                //set data to layout row_type_two
            }

        }


    }
}