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_nameてidを入れ、list_map同じものをに追加しlist_categoryます。ここでは、list_categoryにlist_mapインスタンスを追加しています。mapのキー(category_nameとid)は同じであるため、

1つのキーに対応する1つの値のみを格納できるため、これらのキーの最後に挿入された値を格納します。

新しいデータでlist_mapを更新すると、インスタンス自体が変更されます)、そのため、最後のlist_mapデータが6回表示されます。

解決策:ここでできることは、新しいキーワードのみを使用してループ内でlist_mapを初期化することです。これにより、list_categoryに挿入するたびに新しいインスタンスが挿入されます。または、2つのd配列を使用できます。ハッシュマップの代わりに。

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

PS:データの重複を引き起こしているコードの1つの問題を指摘しましたが、他の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 に答える