【问题标题】:How to divide nested ArrayList to the every layout at TabLayout如何将嵌套的 ArrayList 划分为 TabLayout 的每个布局
【发布时间】:2016-01-26 14:58:59
【问题描述】:

我正在为 Tablayout 使用嵌套的 ArrayList。 ArrayList 的每个元素填充每个选项卡。选项卡计数根据父数组列表的大小而变化。例如当父 ArrayList 的大小为 2 时,制表符计数为 2;当 size 3 tab count 3..etc..为了解释这种情况很困难,我准备了解释图像..

图片 1

此图片代表一般外观。我想用 ArrayLists 每个元素填充这个 TextViews

图片 2

这张图片代表我的数据类型; 键和值 ArrayList 是嵌套的arraylist,它们在每个索引中都包含arraylist。

图 3 - 图 4 - 图 5

这些图像代表了 tabLayouts 过去的样子。我希望我的数据看起来像这些图像。

所以问题是 PopUpDetailsAdapterPlanT 类;

当我在每行下方使用代码时,会填充相同的项目。对于此示例,每一行都写入 ArrayList 的最后一个元素 (Location - Minnesota) 我该如何处理这个问题。感谢您的帮助

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);
    }
}

【问题讨论】:

  • 通过遍历所有数据列表,您将始终得到最后一个列表中的数据。相反,您应该向您的适配器传递一个表示选项卡指示器的 int 值,以及来自 getView() 的位置,您可以检索正确的数据,如下所示:tv1.setText(keys.get(tabIndicator).get(position)); tv2.setText(values.get(tabIndicator).get(position));
  • 那么我怎样才能得到 tabIndicator - 你应该在为那个标签创建适配器时知道这一点,然后将这些信息传递给适配器。
  • 您不是将所有值分配给相同的两个文本视图吗? tv1 和 tv2?
  • 另一个重要提示:请不要使用for 循环您的ArrayLists。使用迭代器,效率更高。
  • @salih 像这样迭代:for (ArrayList&lt;Object&gt; mKeys : keys) {for (Object object : mKeys) {}}

标签: android arraylist android-arrayadapter android-tablayout


【解决方案1】:

希望我能正确理解您的要求和代码。我了解您的布局中只有 2 个 TextViews 用于 10 个不同的文本。所以...在这种情况下,您需要 10 个 TextView 用于 ObjectID、行号、姓名、年龄、姓氏、位置等。您不能只有 2 个 TextView。

让我们从这个开始,希望我们所有人都能弄清楚这些问题。

【讨论】:

    【解决方案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】:

    根据您发布的问题下的 cmets,我建议您使用不同的数据结构。 示例代码:

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

    注意事项:

    • 对象键包含主键 ID。
    • 对象值包含一个类,我称之为Person。 Person 是一个包含姓名、姓氏、年龄和位置的类。该类可以灵活地添加另一个属性。

    如果这个设计看起来适合你,那么我们可以更详细地讨论它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多