0

テキストとチェックボックスを含むリストビューがあります。リスト ビューをスクロールしているときに、チェックボックスの動作がおかしい。リサイクルの問題のようです。とにかく、いくつかの同様の投稿で提案されているさまざまなオプションを試しましたが、どれもうまくいきませんでした。投稿の1つで提案されているように、タグの位置を設定して取得しようとしましたが、運が悪かったです。リスト ビューのアクティビティ ファイルでカスタム アダプターを使用しています。以下にいくつかのコード スニペットを示します。活動クラス:

lv = (ListView) findViewById(R.id.itemdisplay_listview);
lv.setAdapter(new CustomAdapter(this, itemNames, tableNo));

カスタム アダプター:

private class CustomAdapter extends BaseAdapter {

        private List<String> mListItems;
        private LayoutInflater mLayoutInflater;
        ViewHolder holder;
        int a = 1;

        public CustomAdapter(Context context, List<String> arrayList,
                String table) {
            tableNumber = table;
            mListItems = arrayList;

            // get the layout inflater
            mLayoutInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

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

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

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

        private class ViewHolder {

            TextView itemName, quantity;
            CheckBox checkbox;
            ImageButton addBtn, minusBtn;

        }

        @Override
        public View getView(int position, View convertview, ViewGroup viewGroup) {

            // create a ViewHolder reference

            // check to see if the reused view is null or not, if is not null
            // then
            // reuse it
            if (convertview == null) {
                holder = new ViewHolder();

                convertview = mLayoutInflater.inflate(
                        R.layout.itemdisplay_list, null);

                holder.itemName = (TextView) convertview
                        .findViewById(R.id.itemdisplaylist_name);
                holder.addBtn = (ImageButton) convertview
                        .findViewById(R.id.itemdisplaylist_add);
                holder.minusBtn = (ImageButton) convertview
                        .findViewById(R.id.itemdisplaylist_minus);
                holder.quantity = (TextView) convertview
                        .findViewById(R.id.itemdisplaylist_quantity);
                holder.checkbox = (CheckBox) convertview
                        .findViewById(R.id.itemdisplaylist_cbox);

                // holder.checkbox.setTag(position);


                // the setTag is used to store the data within this view
                convertview.setTag(holder);
            } else {
                // the getTag returns the viewHolder object set as a tag to the
                // view
                holder = (ViewHolder) convertview.getTag();
            }

            holder.checkbox.setOnClickListener(checkListener);
            doneBtn.setEnabled(true);

            holder.minusBtn.setImageResource(R.drawable.minus);
            holder.quantity.setText(String.valueOf(a));
            holder.addBtn.setImageResource(R.drawable.add);
            holder.addBtn.setOnClickListener(addBtnClick);
            holder.minusBtn.setOnClickListener(minusBtnClick);

            String stringItem = mListItems.get(position);

            if (stringItem != null) {
                if (holder.itemName != null) {
                    // set the item name on the TextView
                    holder.itemName.setText(stringItem);
                }
            }

            // this method must return the view corresponding to the data at the
            // specified position.
            return convertview;

        }

        private OnClickListener checkListener = new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                /*doneBtn.setOnClickListener(doneBtnClick);*/
                View view = (View) v.getParent();

                CheckBox cb = (CheckBox) view
                        .findViewById(R.id.itemdisplaylist_cbox);
                TextView tv = (TextView) view
                        .findViewById(R.id.itemdisplaylist_name);
                TextView tv1 = (TextView) view
                        .findViewById(R.id.itemdisplaylist_quantity);
                if (cb.isChecked()) {
                    map.put(tv.getText().toString(), tv1.getText().toString());
                } else {
                    for (Iterator<Map.Entry<String, String>> it = map
                            .entrySet().iterator(); it.hasNext();) {

                        Map.Entry<String, String> entry = it.next();
                        String item = entry.getKey();
                        if ((tv.getText().toString()).equals(item)) {
                            it.remove();
                        }
                    }
                }

            }
        };

私はかなり長い間苦労してきました。お知らせ下さい。ありがとう。

4

5 に答える 5

1

100 個の CBのデータがあるとしたら、それらのデータも保存する必要がありますchecked/unchecked state。100 個の要素CheckedStatus[100]のブール配列としましょう。GetView で行う

 if(CheckedStatus[position] == true) {
 // check the check box
 } else {
 // uncheck it 
}.

位置は GetView 関数で受け取ったものです

于 2013-09-26T04:28:25.003 に答える
1

カスタムリストビューアダプタでは、setOnCheckedChangeListener 呼び出した後に setChecked を呼び出します。このようにして、リサイクルされたビューから古いリスナーへのリンクを切断します。

于 2014-12-17T09:43:20.647 に答える