2017-07-26 93 views
0

我试图创建一个与复选框的列表视图。所以这是每当我点击一个复选框并向下或向上滚动时的问题,它会自动检查列表中我没有点击的其他复选框。我已经在这里搜索和阅读其他线程,但没有一个解决了我的问题。与复选框的自定义列表视图问题

这是我迄今为止所做的。

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


     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.row_songs, null, true); 

      viewHolder = new ViewHolder(); 

      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); 
      viewHolder.tvSongName = (TextView) convertView.findViewById(R.id.tvSongName); 
      viewHolder.tvSongArtist = (TextView) convertView.findViewById(R.id.tvArtistName); 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 


     viewHolder.tvSongName.setText(_songs.get(position).getSongname()); 
     viewHolder.tvSongArtist.setText(_songs.get(position).getArtistname()); 
     viewHolder.checkBox.setTag(R.integer.btnplusview, convertView); 

     viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (Integer) buttonView.getTag(); 
        _songs.get(getPosition).setSelected(buttonView.isChecked()); 


        if (_songs.get(getPosition).isSelected()) { 
         _songs.get(getPosition).setSelected(false); 
         Toast.makeText(getApplicationContext(), "position " + position + " " + _songs.get(position).getSongUrl(), 
           Toast.LENGTH_LONG).show(); 
         Log.e("URL", _songs.get(position).getSongUrl() + " "); 
        } else { 
         _songs.get(getPosition).setSelected(true); 

        } 


       } 


      }); 
      convertView.setTag(R.id.tvSongName, viewHolder.tvSongName); 
      convertView.setTag(R.id.tvArtistName, viewHolder.tvSongArtist); 
      convertView.setTag(R.id.checkBox, viewHolder.checkBox); 

     viewHolder.checkBox.setTag(position); 

     viewHolder.checkBox.setChecked(_songs.get(position).isSelected()); 

     return convertView; 
    } 

我应该怎么做才能解决这个问题?

在此先感谢!

回答

0

滚动时,setOnCheckedChangeListener被调用。因此,要处理,在获取视图,你需要做以下 -

viewHolder.checkBox.setOnCheckedChangeListener(null); 
viewHolder.checkBox.setChecked(_songs.get(position).isSelected()); 

您首先需要设置onchecked空以便在滚动时视图得到填充,要指定值复选框的意见,你不调用onCheckedListener。

然后你需要调用OnCheckedChangeListener

viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); 
       //remove this line from the code. The below one 
       _songs.get(getPosition).setSelected(buttonView.isChecked()); 


       if (_songs.get(getPosition).isSelected()) { 
        _songs.get(getPosition).setSelected(false); 
        Toast.makeText(getApplicationContext(), "position " + position + " " + _songs.get(position).getSongUrl(), 
          Toast.LENGTH_LONG).show(); 
        Log.e("URL", _songs.get(position).getSongUrl() + " "); 
       } else { 
        _songs.get(getPosition).setSelected(true); 

       } 


      } 


     }); 
+0

我想你说,它没有工作:(当我滚动列表视图上下取消选中我点击的复选框。 –

+0

但它没有检查任何其他复选框在此刻权利,以便部分解决?现在我们只需要确保在复选框没有问题的情况下选中 –

+0

我更新了ans。在你的onCheckedChange中你已经改变了复选框的状态两次,删除一次。@AkiBeiBei –

2

每当你滚动setOnCheckedChangeListener被称为

删除setOnCheckedChangeListener和实施setOnClickListener

viewHolder.checkBox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        if (viewHolder.checkbox.isChecked()) { 
         your logic id true 
        } else { 
         your logic id false 
        } 
       } 
      }); 
+0

我尝试这样做太多,但它不工作,当我向下滚动所有的复选框是选中:(但还是谢谢你回答。 –

相关问题