【问题标题】:How to use correctly CheckBox in CustomListview如何在 CustomListview 中正确使用 CheckBox
【发布时间】:2013-01-16 10:10:05
【问题描述】:

我有一个带有 [PICTURE] - [TEXT] - [CHECKBOX] 的自定义列表视图 当我选择一个复选框并且我喜欢向下滚动时,会选择更多复选框。 为什么呢?我该如何解决这个问题?

-> 我只选择一个复选框 -> 然后我向下滑动并选择了更多复选框

最好的祝福 MSeiz5

我的自定义适配器_

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

【问题讨论】:

    标签: android checkbox android-listview


    【解决方案1】:

    ListView 中 CheckBox 的问题在于,视图由于 ListView 的回收而被回收,并且 Checkbox 的值(选中或取消选中)未维护。为了保持 CheckBox 的状态,必须有一些东西可以存储 Checkbox 的状态。

    参考这个Link。它有很好解释的例子。

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

    【讨论】:

    • 我不明白...这对我来说很复杂
    • 他所说的,就是像我在我的例子中那样做的事情
    • @MarcoSeiz 为了便于理解,我添加了简单的适配器,它的列表项为图像、复选框、文本视图。检查它:)
    • 是的,您需要添加的是复选框数组及其 setOnClickListener。试试这个:)
    • @MarcoSeiz 如果我的回答对你有帮助,别忘了接受 :)
    【解决方案2】:

    尝试设置复选框的标签,并在设置复选框的值时检查标签。

    【讨论】:

      【解决方案3】:

      试试这个..它可能会帮助你。

      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

      【讨论】:

      • 使用 CHOID_MODE_MULTIPLE 我无法在我的列表视图中选择一个项目...当我选择复选框时问题仍然存在...我在我的问题中添加了一个屏幕截图...
      【解决方案4】:

      我遇到了同样的问题...

      我做了什么:

      在我的对象中,我输入了 boolean id_selected,在我的 CustomAdapter 中,我检查是否选择了对象(然后我检查了复选框),在 getView 中我禁用了可单击的复选框,在 @ 987654323@ 单击我反转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;
      

      我修改了我的一些类,但精髓在里面……在我原来的类中,我使用了反射和其他特定的方法。

      【讨论】:

        【解决方案5】:
        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)));
          }
        }
        

        【讨论】:

          【解决方案6】:

          您必须使用自定义适配器存储项目的状态,如下例所示:

          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);
          
                  //...
               }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-11
            • 1970-01-01
            • 2016-04-27
            • 1970-01-01
            • 2022-01-22
            • 2022-01-06
            相关资源
            最近更新 更多