java—baseadapter中仅显示listview中的最后一项

eimct9ow  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(335)

我正在尝试解析以下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"
         }
      ] 
   }]
}

我的baseadapter只显示listview中的最后一项。我正在尝试检索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);
            }
        }
    }
nhaq1z21

nhaq1z211#

问题在于代码的这一部分:

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

            }
        }

对于每个列表项,您都要依次设置键和值。所以在for循环的末尾,只剩下最后一个。
例如:联系人列表-{you,me,dupree}你正在做的是
vh.textviewname(你)
vh.textviewname(我)
vh.textviewname(双重)
所以你总是能在你的名单上看到杜普利。
传递 Map<String, List<EffectList>> map 直接地
如果您只想在列表中显示textviewname和textviewemail。然后创建一个包含名称和电子邮件的对象列表。

class Contact {
public String name;
public String email;
}

List<Contact> contacts;

现在把这个触点传给适配器。保持简单。

vcirk6k6

vcirk6k62#

在代码中:

EffectList item = getItem(position).get(key).get(0);
``` `getItem(position)` 将返回u a
Map < String, List < EffectList>> `getItem(position).get(key)` 我会还给你的 `List< EffectList >` 为了那把钥匙。 `getItem(position).get(key).get(0)` 将始终返回列表中零位置的元素。 `List< EffectList >` .
所以,简单的解决方法是从列表中获取正确的位置,而不是硬编码到 `get(0)` ..

相关问题