Подтвердить что ты не робот

Как разделить вложенный массив ArrayList на каждый макет в TabLayout

Я использую вложенный массив ArrayList для Tablayout. Каждый элемент ArrayList заполняет каждую Tab. Количество вкладок изменяется в зависимости от размера родительского массива. Например, если родительский размер ArrayList 2, количество вкладок 2; когда размер 3 вкладки счет 3..etc..Для объяснения этой ситуации сложно, я подготовил изображение экспатриантов.

Изображение 1

Это изображение представляет собой общий вид. Я хочу, чтобы этот TextViews заполнил ArrayLists каждый элемент

Изображение 2

Это изображение представляет собой мой тип данных; ключи и значения ArrayList является вложенным arraylist, и они содержат arraylist в каждом индексе.

Изображение 3 - Изображение 4 - Изображение 5

Эти изображения представляют, как были использованы tabLayouts. Я хочу, чтобы мои данные выглядели как эти изображения.

Таким образом, проблема заключается в классе PopUpDetailsAdapterPlanT;

Когда я использую коды, расположенные ниже каждой строки, заполняются одним и тем же элементом. В этом примере каждая строка записывает последний элемент ArrayList (Местоположение - Миннесота). Как я могу справиться с этой проблемой. Спасибо за помощь

public class PopUpDetailsAdapterPlanT extends ArrayAdapter {
Context context;
private ArrayList<ArrayList<Object>> keys;
private ArrayList<ArrayList<String>> values;

    public PopUpDetailsAdapterPlanT(Context context, ArrayList<ArrayList<Object>> keys, ArrayList<ArrayList<String>> values) {
        super(context,R.layout.popupdetails_listview_simpleitem);
        this.keys = keys;
        this.values = values;
        this.context = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.popupdetails_listview_simpleitem, null);
        }

        TextView tv1 = (TextView) v.findViewById(R.id.hashmapKeys);
        TextView tv2 = (TextView) v.findViewById(R.id.hashmapValues);

        for (int i = 0; i < keys.size(); i++) {
            ArrayList<Object> mKeys = new ArrayList<>(keys.get(i));
            ArrayList<String> mValues = new ArrayList<>(values.get(i));
            for (int j = 0; j <mKeys.size() ; j++) {
                tv1.setText(String.valueOf(mKeys.get(j)));
                tv2.setText(String.valueOf(mValues.get(j)));
            }

        }
        return v;
    }

    @Override
    public int getCount() {
        return keys.get(0).size();
    }

    @Override
    public Object getItem(int position) {
        if (position >= keys.size())
            return values.get(position);
        return keys.get(position);
    }
}

введите описание изображения здесь

4b9b3361

Ответ 1

Надеюсь, я правильно понимаю ваши требования и код. Я понимаю, что у вас есть только 2 TextViews в макете для 10 разных текстов. Итак... в этом случае вам нужно 10 TextViews для ObjectID, строки #, имени, возраста, фамилии, местоположения и т.д. У вас не может быть только 2 TextViews.

Начнем с этого и, надеюсь, проблемы будут выяснены для всех нас.

Ответ 2

Если вы можете передать соответствующий индекс вкладки каждому адаптеру фрагмента. Вы можете изменить адаптер фрагмента, как показано ниже, и попробовать:

public class PopUpDetailsAdapterPlanT extends ArrayAdapter {
    Context context;
    private ArrayList<Object> keys;
    private ArrayList<String> values;

    public PopUpDetailsAdapterPlanT(Context context, ArrayList<ArrayList<Object>> keys, ArrayList<ArrayList<String>> values, int tabIndex) {
        super(context,R.layout.popupdetails_listview_simpleitem);
        this.keys = keys.get(tabIndex);
        this.values = values.get(tabIndex);
        this.context = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.popupdetails_listview_simpleitem, null);
        }

        TextView tv1 = (TextView) v.findViewById(R.id.hashmapKeys);
        TextView tv2 = (TextView) v.findViewById(R.id.hashmapValues);


        tv1.setText(String.valueOf(keys.get(position)));
        tv2.setText(String.valueOf(values.get(position)));

        return v;
    }

    @Override
    public int getCount() {
        return keys.size();
    }

    @Override
    public Object getItem(int position) {
        if (position >= keys.size())
            return values.get(position);
        return keys.get(position);
    }
}

Ответ 3

Я предлагаю вам другую структуру данных, основываясь на ваших комментариях по опубликованной проблеме. Пример кода:

private ArrayList<Integer> keys;
private ArrayList<Person> values;

Примечания:

  • Ключи объектов содержат идентификаторы первичного ключа.
  • Значения объектов содержат класс, я называю его Person. Лицо - это класс, содержащий имя, фамилию, возраст и местоположение. Класс обладает гибкостью добавления другого атрибута.

Если этот дизайн кажется вам правильным, мы можем обсудить его более подробно.