Android отображает два массива с разными типами в одном бесшовном списке с помощью адаптеров - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть пользовательский ArrayAdapter базового класса. У меня также есть подкласс, и я хочу, чтобы ArrayAdapter мог получать два разных типа данных, т.е. (arrayList и arraylist) и отображать их последовательно в одном бесшовном listview.

Я никогда не делал этого раньше, поэтому общие комментарии и рекомендации очень ценятся. Я попытался сделать универсальный ArrayAdapter:

public class MyAdapter<T extends BaseClass> extends ArrayAdapter<T>

с помощью этого конструктора:

public MyAdapter(Context context, ArrayList<T> items) {
        super(context, 0, items);
        fullList = items;  
    }

Но я не знаю, как передать универсальный ArrayList, который может иметь подкласс типа или базукласс. (и этот подход позже будет включать в себя код, который использует instanceOf, который не является лучшим способом сделать что-то ... как я узнал из SO)

Вместо обобщений я думал о расширении этого пользовательского arrayadapterсам. Но я не уверен, как это будет работать.

Как лучше всего подойти к этому? Может быть, для этого случая лучше подходит адаптер, отличный от arrayadapter. Или, может быть, у recyclerview есть решение этой проблемы?

В конечном итоге я хочу иметь два одинаковых, но разных типа наборов данных (один подкласс другого), выводимых как одно бесшовное представление списка. Я не смог найти общий подход к этому.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Вы можете решить эту проблему, используя тип представления.

пример:

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>

row_type_two.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="horizontal">

    <ImageView
        android:id="@+id/logo"
        android:layout_width="100dp"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/txtTypeOne"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

YourTypeOne.java

public class YourTypeOne{
    public String title;
}

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
            }

        }


    }
}

удачи. :)

0 голосов
/ 05 ноября 2019

Какие типы данных вы используете в своих списках ArrayLists?

Если, например, строки и целые числа, не могли бы вы преобразовать значения и объединить их в один ArrayList?

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

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

}

тогдаВы можете просто применить один ArrayList к стандартному ArrayAdapter.

...