【问题标题】:ListView shows only one itemListView 只显示一项
【发布时间】:2017-01-06 05:31:17
【问题描述】:

我正在尝试在 ListView 中显示 Json。我正在使用Map 来检索值。列表中仅显示第一项。 BaseAdapter 中的 getCount() 每次都会将大小返回为 1,即使 Map 中有多个值也是如此。

MyContactAdapter2 .java

public class MyContactAdapter2 extends BaseAdapter {
        List<Map<String, List<EffectList>>> contactList;
        Context context;
        private LayoutInflater mInflater;


        // Constructors
        public MyContactAdapter2(Context context, List<Map<String, List<EffectList>>> objects) {

            this.context = context;
            this.mInflater = LayoutInflater.from(context);
            contactList = objects;
        }

        public MyContactAdapter2() {
            System.out.println("hai");
        }

        @Override
        public int getCount() {
            int count = contactList.size();
            System.out.println("Count size" + count);
            return count;
        }

        @Override
        public Map<String, List<EffectList>> getItem(int position) {
            return contactList.get(position);
        }


        @Override
        public long getItemId(int position) {
            return 0;
        }


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


            System.out.println(10);


            final MyContactAdapter2.ViewHolder vh;
            if (convertView == null) {
                View view = mInflater.inflate(R.layout.get_layout_row_view, parent, false);
                vh = MyContactAdapter2.ViewHolder.create((RelativeLayout) view);
                view.setTag(vh);

            } else {
                vh = (MyContactAdapter2.ViewHolder) convertView.getTag();
            }





            for (Map<String, List<EffectList>> map : contactList) {
                for (Map.Entry<String, List<EffectList>> entry : map.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    System.out.println("key :" + key + "value :" + value);

                        EffectList item = getItem(position).get(key).get(0);

                        vh.textViewName.setText(item.getEffectsId());
                        vh.textViewEmail.setText(item.getEffectsName());

                }
            }


            return vh.rootView;
        }


        private static class ViewHolder {
            public final RelativeLayout rootView;
            public final ImageView imageView;
            public final TextView textViewName;
            public final TextView textViewEmail;

            private ViewHolder(RelativeLayout rootView, ImageView imageView, TextView textViewName, TextView textViewEmail) {
                this.rootView = rootView;
                this.imageView = imageView;
                this.textViewName = textViewName;
                this.textViewEmail = textViewEmail;
            }

            public static MyContactAdapter2.ViewHolder create(RelativeLayout rootView) {
                ImageView imageView = (ImageView) rootView.findViewById(R.id.imageView);
                TextView textViewName = (TextView) rootView.findViewById(R.id.textViewName);
                TextView textViewEmail = (TextView) rootView.findViewById(R.id.textViewEmail);
                return new MyContactAdapter2.ViewHolder(rootView, imageView, textViewName, textViewEmail);
            }
        }
    } 

我在迭代 Map 时做错了吗?

这是我要解析的 Json。

{
"effect_list": [{
      "1":[  
         {  
            "effects_id":"1",
            "effects_name":"Band 1"
         },
         {  
            "effects_id":"2",
            "effects_name":"Band 2"
         }


      ],
      "2": [ 
         {  
            "effects_id":"4",
            "effects_name":"Background Blur"
         },
         {  
            "effects_id":"5",
            "effects_name":"Blemish Removal"
         }
      ] 
   }]
}

我想显示 1(0) 和 2(0)。只有 1(0) 个 ("effects_id":"1") 显示在 ListView

为什么我的 getCount() 大小总是 1,即使它有多个值?

【问题讨论】:

  • 为什么要制作不同的“1”和“2”数组?当两者中都有“effects_id”和“effects_name”相同的键时
  • 但值不同。我想显示值
  • 我知道价值观总是不同的。我认为你应该很好地维护你的 json
  • 在解析 json 并设置为适配器时发布代码。 getCount() 大小始终为 1 => 解析 json 时你错了

标签: java android listview baseadapter


【解决方案1】:

试试这个,

public class MyContactAdapter2 extends BaseAdapter {
    List<EffectList> contacts;
    Context context;
    private LayoutInflater mInflater;


    // Constructors
    public MyContactAdapter2(Context context, List<Map<String, List<EffectList>>> objects) {

    this.context = context;
    this.mInflater = LayoutInflater.from(context);
    this.contacts = new ArrayList<>();
    Map<String, List<EffectList>> map = objects.get(0);
    Set<String> keySet = map.keySet();
    Iterator<String> iterator = keySet.iterator();
    while (iterator.hasNext()) {
        this.contacts.addAll(map.get(iterator.next()));
    }
}

    public MyContactAdapter2() {
        System.out.println("hai");
    }

    @Override
    public int getCount() {
        int count = contacts.size();
        return count;
    }

    @Override
    public EffectList getItem(int position) {
        return contacts.get(position);
    }


    @Override
    public long getItemId(int position) {
        return 0;
    }


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


        System.out.println(10);


        final MyContactAdapter2.ViewHolder vh;
        if (convertView == null) {
            View view = mInflater.inflate(R.layout.get_layout_row_view, parent, false);
            vh = MyContactAdapter2.ViewHolder.create((RelativeLayout) view);
            view.setTag(vh);

        } else {
            vh = (MyContactAdapter2.ViewHolder) convertView.getTag();
        }
            EffectList item = getItem(position);

            vh.textViewName.setText(item.getEffectsId());
            vh.textViewEmail.setText(item.getEffectsName());


        return vh.rootView;
    }


    private static class ViewHolder {
        public final RelativeLayout rootView;
        public final ImageView imageView;
        public final TextView textViewName;
        public final TextView textViewEmail;

        private ViewHolder(RelativeLayout rootView, ImageView imageView, TextView textViewName, TextView textViewEmail) {
            this.rootView = rootView;
            this.imageView = imageView;
            this.textViewName = textViewName;
            this.textViewEmail = textViewEmail;
        }

        public static MyContactAdapter2.ViewHolder create(RelativeLayout rootView) {
            ImageView imageView = (ImageView) rootView.findViewById(R.id.imageView);
            TextView textViewName = (TextView) rootView.findViewById(R.id.textViewName);
            TextView textViewEmail = (TextView) rootView.findViewById(R.id.textViewEmail);
            return new MyContactAdapter2.ViewHolder(rootView, imageView, textViewName, textViewEmail);
        }
    }
}

【讨论】:

  • 我收到 OutOfMemoryError
  • 改变构造函数
  • 非常感谢。成功了!
  • 如果我只想显示“1”的值,我该怎么做?
【解决方案2】:

我认为有击球方式可以添加到列表中

    ArrayList<EffectList> data = new ArrayList<>();


     for (Map<String, List<EffectList>> map : contactList) {
                    for (Map.Entry<String, List<EffectList>> entry : map.entrySet()) {
                        String key = entry.getKey();
                        List<EffectList> value = entry.getValue();
                        data.addAll(value);
                    }
                }

MyContactAdapter2  mAdpter = new MyContactAdapter2(this,data);
list.setAdapter(mAdpter);

然后在适配器中使用 data 列表

public class MyContactAdapter2 extends BaseAdapter {
        ArrayList<EffectList> contactList;
        Context context;
        private LayoutInflater mInflater;


        // Constructors
        public MyContactAdapter2(Context context, ArrayList<EffectList> data ) {

            this.context = context;
            this.mInflater = LayoutInflater.from(context);
            contactList = data ;
        }

        public MyContactAdapter2() {
            System.out.println("hai");
        }

        @Override
        public int getCount() {
            int count = contactList.size();
            System.out.println("Count size" + count);
            return count;
        }

        @Override
        public EffectList getItem(int position) {
            return contactList.get(position);
        }


        @Override
        public long getItemId(int position) {
            return 0;
        }


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


            System.out.println(10);


            final MyContactAdapter2.ViewHolder vh;
            if (convertView == null) {
                View view = mInflater.inflate(R.layout.get_layout_row_view, parent, false);
                vh = MyContactAdapter2.ViewHolder.create((RelativeLayout) view);
                view.setTag(vh);

            } else {
                vh = (MyContactAdapter2.ViewHolder) convertView.getTag();
            }

                        EffectList item = getItem(position);

                        vh.textViewName.setText(item.getEffectsId());
                        vh.textViewEmail.setText(item.getEffectsName());



            return vh.rootView;
        }

【讨论】:

  • 我应该在哪里迭代地图?如果我在 getview() 中迭代它,我会收到错误
  • 我编辑了代码。这需要在适配器设置到列表之前调用。
【解决方案3】:

您的列表视图仅显示一项,因为您只有一项。 effect_list 只有一个元素:

{
  "1": [
    {
      "effects_id": "1",
      "effects_name": "Band 1"
    },
    {
      "effects_id": "2",
      "effects_name": "Band 2"
    }
  ],
  "2": [
    {
      "effects_id": "4",
      "effects_name": "Background Blur"
    },
    {
      "effects_id": "5",
      "effects_name": "Blemish Removal"
    }
  ]
}

【讨论】:

    【解决方案4】:

    让你的 json 像下面这样并相应地使用。

    {
    "effect_list": [
         
             {  
                "effects_id":"1",
                "effects_name":"Band 1"
             },
             {  
                "effects_id":"2",
                "effects_name":"Band 2"
             },
             {  
                "effects_id":"4",
                "effects_name":"Background Blur"
             },
             {  
                "effects_id":"5",
                "effects_name":"Blemish Removal"
             }
         
       ]
    }

    您可以通过 effect_list.size 并获取每个值

    【讨论】:

    • 但是那些“1”和“2”是动态对象。
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多