0

我正在尝试从服务器获取listview使用中的项目json,为此我制作了我的自定义适配器。但是如果服务器上有 6 个项目,它会在列表视图中显示最后一个项目 6 次,并且我已经给出了checkbox列表中每个项目的前面,以获取选中项目的 id。这是我的代码:

btnclub.setOnClickListener(new OnClickListener() {

        ArrayList<Integer> checkedList = new ArrayList<Integer>();

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Dialog d = new Dialog(TennerTextActivity.this);
            d.setContentView(R.layout.slctevnt);

            ListView list = (ListView) d.findViewById(R.id.list_mulitple);
            HashMap<String, String> list_map = new HashMap<String, String>();

            // Initialize CATEGORY_LIST HERE
            try {
                client = new DefaultHttpClient();
                HttpGet get = new HttpGet(
                        "http://dhklashfgsdhgsdg");
                HttpResponse rp = client.execute(get);
                String result = EntityUtils.toString(rp.getEntity());
                System.out.println("----------------------- result: "
                        + result);

                result = "{\"root\": " + result + "}";
                JSONObject root = new JSONObject(result);
                JSONArray sessions = root.getJSONArray("root");

                for (int i = 0; i < sessions.length(); i++) {
                    HashMap<String, String> map2 = new HashMap<String, String>();
                    JSONObject e = sessions.getJSONObject(i);
                    list_map.put("category_name", e.getString("name"));
                    list_map.put("category_id", e.getString("id"));
                    list_category.add(list_map);

                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            list.setAdapter(new MyAdapter());
            d.show();
            Button btndone = (Button) d.findViewById(R.id.button_multiple);
            btndone.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    for(int i = 0 ; i < checkedList.size() ; i++) {
                        clubs = "," + String.valueOf(checkedList.get(i));
                    }
                    clubs = clubs.substring(1);
                    System.out.print(clubs);
                    Log.e("club", clubs);
                }
            });

我的适配器是:

class MyAdapter extends BaseAdapter {



            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return list_category.size();
            }

            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return 0;
            }

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

                if (convertView == null) {
                    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.dialoglist,
                            null);
                    TextView item = (TextView) convertView
                            .findViewById(R.id.dialogitem);
                    item.setText(list_category.get(position).get(
                            "category_name"));


                }
                CheckBox check = (CheckBox)convertView.findViewById(R.id.checkBox_list);
                check.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        // TODO Auto-generated method stub
                        if(isChecked) {
                            int temp = Integer.parseInt(list_category.get(position).get("category_id"));
                            checkedList.add(temp);
                            Object[] tempArray = checkedList.toArray();
                            Arrays.sort(tempArray);
                            checkedList.clear();
                            for(int i = 0 ; i < tempArray.length ; i++) {
                                checkedList.add((Integer) tempArray[i]);
                            }
                        }
                    }
                });

                return convertView;
            }

        }

请告诉我哪里做错了......

4

3 回答 3

1

我认为您必须像这样更改 for 循环

 for (int i = 0; i < sessions.length(); i++) {
                        HashMap<String, String> map2 = new HashMap<String, String>();
 HashMap<String, String> list_map = new HashMap<String, String>();

                        JSONObject e = sessions.getJSONObject(i);
                        list_map.put("category_name", e.getString("name"));
                        list_map.put("category_id", e.getString("id"));
                        list_category.add(list_map);

                    }
于 2012-07-17T05:23:49.813 回答
1

问题在下面一行

                   list_map.put("category_name", e.getString("name"));
                    list_map.put("category_id", e.getString("id"));
                    list_category.add(list_map);

您将category_nameid 放入list_map并将其添加到list_category. 在这里,您在 list_category 中添加 list_map 实例。并且因为 map 的键(即 category_name 和 id )是相同的,

它只能存储与一个键对应的一个值,因此它存储这些键的最后插入值。

当您使用新数据更新 list_map 时,实例本身会发生变化),这就是它显示最后一个 list_map 数据的 6 次的原因。

解决方案:您可以在这里做什么,仅使用 new 关键字在循环中初始化 list_map,因此每次插入 list_category 时都会插入新实例。或者你可以使用两个 d 数组。而不是哈希图。

HashMap<String, String> list_map = new HashMap<String, String>();

PS:我在您的代码中指出了一个问题,这导致数据重复,其他 SO 成员也可能存在其他问题。

编辑: 替换您的以下代码

for(int i = 0 ; i < checkedList.size() ; i++) {
                        clubs = "," + String.valueOf(checkedList.get(i));
                    }
                    clubs = clubs.substring(1);

像下面这样

   StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < checkedList.size() ; i++) {
                       sb.add(String.valueOf(checkedList.get(i))+",");
                    }
                 sb.deleteCharAt(sb.lastIndexOf(","));
于 2012-07-17T05:25:35.357 回答
0

getView像这样改变方法

if (convertView == null) 
{
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.dialoglist,null);
}

TextView item = (TextView) convertView.findViewById(R.id.dialogitem);
item.setText(list_category.get(position).get("category_name"));  
于 2012-07-17T05:15:57.887 回答