0

[PICTURE] - [TEXT] - [CHECKBOX] のカスタム リストビューがあります。チェックボックスを選択して下にスクロールしたい場合、さらに多くのチェックボックスが選択されています。どうしてこんなことに?そして、どうすればこの問題を解決できますか?

-> 1 つのチェックボックスを選択するだけです -> 次にスクロールダウンすると、さらに多くのチェックボックスが選択されます

ここに画像の説明を入力 ここに画像の説明を入力 よろしくMSeiz5

私の CustomAdapter_

public class CustomAdapter extends BaseAdapter{
            TextView rawTextView;

            boolean[] checkBoxState;
            LayoutInflater mInflater;   
            ListContent holder;
            private ArrayList<Notification> arrNotification=null;

    private ArrayList<HashMap<String, String>> arrlist = new ArrayList<HashMap<String, String>>();


    public CustomAdapter(ArrayList<HashMap<String, String>> arrlist) {

        arrNotification = new ArrayList<Notification>();

        mInflater = LayoutInflater.from(connected_upload.this);
        checkBoxState=new boolean[arrNotification.size()];            
        this.arrlist = arrlist;
    }


    @Override
    public int getCount() {
        return arrlist.size();
    }

    public int getCount2()
    {
        return arrNotification.size();      
    }

    public Object getItem2(int position) 
    {
        return position;
    }
    public long getItemId2(int position) 
    {
        return position;
    }

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

        convertView = mInflater.inflate(R.layout.connected_upload, null);
        holder=new ListContent();
        holder.checkbox = (CheckBox) convertView.findViewById( R.id.checkBox1 );


        convertView.setTag(holder);

        if(convertView == null){
            // LayoutInflater class is used to instantiate layout XML file into its corresponding View objects.
            LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.connected_upload_row, null);

            holder=new ListContent();
            holder.checkbox = (CheckBox) convertView.findViewById( R.id.checkBox1 );

            convertView.setTag(holder);
        }
                   // R.id.img_list, R.id.string_cell
                     maptemp=new HashMap<String, String>();
                     maptemp=arrlist.get(position);
        rawTextView = (TextView) convertView.findViewById(R.id.string_cell);
        rawTextView.setText(maptemp.get("string_cell"));


            if (isfolder == true){
                imgview=(ImageView) convertView.findViewById(R.id.img_list);
                imgview.setImageResource(R.drawable.folder);

            } else {


                    Bitmap test = getbitpam(maptemp.get("img_list"));
                    imgview=(ImageView) convertView.findViewById(R.id.img_list);

                    imgview.setImageBitmap(test); 

                    System.gc();

            }
        return convertView;
    }


    @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;
    }


}

LogCat:

01-16 13:41:05.885: E/AndroidRuntime(1720): FATAL EXCEPTION: main
01-16 13:41:05.885: E/AndroidRuntime(1720): java.lang.NullPointerException
01-16 13:41:05.885: E/AndroidRuntime(1720):     at mseiz.freeftp.connected_upload$CustomAdapter.getView(connected_upload.java:306)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.AbsListView.obtainView(AbsListView.java:2465)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1250)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.ListView.onMeasure(ListView.java:1162)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:617)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2361)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:617)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1038)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:576)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5057)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.View.measure(View.java:15481)
01-16 13:41:05.885: E/AndroidRuntime(1720):     at android.view.ViewGroup.measureChildWithMargins(V
4

6 に答える 6

1

ListView 内の CheckBox の問題は、ListView のリサイクルによりビューがリサイクルされ、Checkbox (チェックまたはチェック解除) の値が維持されないことです。CheckBox の状態を維持するには、Checkbox の状態を保存できるものが必要です。

このリンクを参照してください。例がよく説明されています。

 public class ListViewAdapter extends BaseAdapter
 {
            private boolean[] checkBoxState;
            private LayoutInflater mInflater;   
            private ListContent holder;
            private ArrayList<Notification> arrNotification=null;
            public ListViewAdapter(Context context,ArrayList<Notification> notify)
            {     
                arrNotification = new ArrayList<Notification>();

                mInflater = LayoutInflater.from(context);
                checkBoxState=new boolean[arrNotification.size()];
                imageLoader=new ImageLoader(NotificationListActivity.this.getApplicationContext());
            }
            public int getCount()
            {
                return arrNotification.size();      
            }

            public Object getItem(int position) 
            {
                return position;
            }
            public long getItemId(int position) 
            {
                return position;
            }
            public View getView(final int position, View convertView, ViewGroup parent)
            {
                if (convertView == null) 
                {
                    convertView = mInflater.inflate(R.layout.noti_list, null);
                    holder=new ListContent();
                    holder.entity_type = (TextView) convertView.findViewById(R.id.entityname_textview);
                    holder.noti_thumb = (ImageView) convertView.findViewById(R.id.img_noti_thumb);
                    holder.checkbox = (CheckBox) convertView.findViewById( R.id.CheckBox01 );

                    convertView.setTag(holder);
                } 
                else
                {
                    holder = (ListContent)convertView.getTag();
                }           

                holder.noti_thumb.setTag(arrNotification.get(position).thumbnail);
                imageLoader.DisplayImage(arrNotification.get(position).thumbnail,NotificationListActivity.this, holder.noti_thumb);

                holder.checkbox.setChecked(checkBoxState[position]);

                holder.checkbox.setOnClickListener(new OnClickListener()
                {
                    public void onClick(View v) 
                    {
                        if (((CheckBox) v).isChecked())
                        {
                            checkBoxState[position]=true;

                        }
                        else
                        {
                            checkBoxState[position]=false;


                        }
                    }
                });


                holder.checkbox.setTag(position);

                return convertView; 
            }
        }

        class ListContent 
        {
            TextView entity_type;
            TextView content_type;
            ImageView noti_thumb;
            CheckBox checkbox;
        }
于 2013-01-16T10:20:37.077 に答える
0

チェックボックスのタグを設定してみて、チェックボックスの値を設定しながらタグを確認してください。

于 2013-01-16T10:19:38.137 に答える
0
List<String> recIdArr = new ArrayList<String>();
List<String> selectedIds = new ArrayList<String>();
List<String> reportslist;
public View getView(final int position, final View convertView, ViewGroup parent) 
{
  View row = super.getView(position, convertView, parent);
  CheckBox cBox=(CheckBox)row.findViewById(R.id.cb1);

  if(cBox.isChecked())
  {
    selectedIds.add(recIdArr.get(reportslistview.getPositionForView(cBox)));    
  }
  else
  {
    selectedIds.remove(recIdArr.get(reportslistview.getPositionForView(cBox)));
  }
}
于 2013-01-16T10:43:46.450 に答える
0

私は同じ問題を抱えていました...

私がしたこと:

オブジェクトに入れboolean id_selected、CustomAdapter に入れ、オブジェクトが選択されているかどうかを確認し (次にチェックボックスをチェックします) getView、チェックボックスのクリック可能を無効にし、クリックでチェックボックスconvertviewを反転しid_selectedて更新します。これにより、ユーザーがチェックボックスまたは行をクリックすると、チェックボックスをオンまたはオフにして、必要なことを実行できます...

次に例を示します。

            final T t = getItem(position);

            if (convertView == null) {
                convertView = inflater.inflate(resourceId, parent, false);
            }

            final View vv = convertView;

            convertView.setClickable(true);
            convertView.setFocusable(true);
            convertView.setBackgroundResource(R.drawable.listview_background);

                  TextView tv_ds_lista          = (TextView) convertView.findViewById(R.id.ds_lista);
            final CheckBox chkbx_id_selecionado = (CheckBox) convertView.findViewById(R.id.id_selecionado);

            chkbx_id_selecionado.setClickable(false);

            convertView.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {    
                        chkbx_id_selecionado.setChecked(!chkbx_id_selecionado.isChecked());

                    t.setId_selecionado(chkbx_id_selecionado.isChecked());

                }
            });

            tv_ds_lista.setText(t.toString());

            return convertView;

クラスの一部を変更しましたが、本質はそこにあります...元のクラスでは、リフレクションやその他の特定のメソッドを使用しています。

于 2013-01-16T10:23:08.470 に答える
0

次の例のように、カスタム アダプターを使用してアイテムの状態を保存する必要があります。

public class MyAdapter extends ArrayAdapter<MyClass> {
// MyClass has a field named 'selected'

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

        View rowView;
        final MyClass item = getItem(position);

        if (convertView == null) {
            LayoutInflater inflator = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflator.inflate(rsc, null);
        } else {
            rowView = (View) convertView;
        }

       //...
       CheckBox chkSelected = (CheckBox) rowView
                .findViewById(R.id.chkSelected);
       chkSelected.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                item.selected = isChecked;
            }
        });
        chkSelected.setChecked(item.selected);

        //...
     }

}
于 2013-01-16T10:45:11.693 に答える
0

これを試してみてください..役立つかもしれません。

mList.setAdapter(new ArrayAdapter<String>
(mSplitActivity,android.R.layout.simple_list_item_multiple_choice, mStrings));
        mList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

これも試してみて ください http://androidcocktail.blogspot.in/2012/04/adding-checkboxes-to-custom-listview-in.html

于 2013-01-16T10:13:55.923 に答える