自定义适配器 - 使用notifydatasetchanged与布尔数组

时间:2014-04-14 20:55:21

标签: android

我创建了一个带有复选框的自定义适配器。 复选框的状态存储在一个布尔数组中,其大小在适配器中定义。

我在异步任务的onProgressUpdate中调用notifydatasetchanged。这意味着每次添加新内容时,我的列表视图都会更新。用户可以看到添加到列表中的内容,而无需等待循环完成。

问题是,在自定义适配器代码中,布尔数组的大小设置为1,并且它不会发生变化,因此当getView中的位置递增时,我的代码会因数组超出界限而失败。 / p>

我使用的代码或多或少与此相同: 这是我使用的CustomAdapter:

//define your custom adapter
private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>>
{
   // boolean array for storing
   //the state of each CheckBox 
   boolean[] checkBoxState;


   ViewHolder viewHolder;




public CustomAdapter(Context context, int textViewResourceId,
   ArrayList<HashMap<String, Object>> players) {

    //let android do the initializing :)
    super(context, textViewResourceId, players); 

  //create the boolean array with
   //initial state as false
  checkBoxState=new boolean[players.size()];
  }


    //class for caching the views in a row  
 private class ViewHolder
 {
   ImageView photo;
   TextView name,team;
   CheckBox checkBox;
 }



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

   if(convertView==null)
    {
   convertView=inflater.inflate(R.layout.players_layout, null);
   viewHolder=new ViewHolder();

    //cache the views
    viewHolder.photo=(ImageView) convertView.findViewById(R.id.photo);
    viewHolder.name=(TextView) convertView.findViewById(R.id.name);
    viewHolder.team=(TextView) convertView.findViewById(R.id.team);
    viewHolder.checkBox=(CheckBox) convertView.findViewById(R.id.checkBox);

     //link the cached views to the convertview
    convertView.setTag( viewHolder);


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


  int photoId=(Integer) players.get(position).get("photo");

  //set the data to be displayed
  viewHolder.photo.setImageDrawable(getResources().getDrawable(photoId));
  viewHolder.name.setText(players.get(position).get("name").toString());
  viewHolder.team.setText(players.get(position).get("team").toString());

   //VITAL PART!!! Set the state of the 
   //CheckBox using the boolean array
        viewHolder.checkBox.setChecked(checkBoxState[position]);// this will FAIL as position will increase


           //for managing the state of the boolean
           //array according to the state of the
           //CheckBox

           viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {

   public void onClick(View v) {
    if(((CheckBox)v).isChecked())
     checkBoxState[position]=true;
    else
     checkBoxState[position]=false;

    }
   });

   //return the view to be displayed
   return convertView;
  }

 }

如何处理布尔数组不会增加的事实?

1 个答案:

答案 0 :(得分:1)

  

如何处理布尔数组不会增加的事实?

这是静态数组 1 的主要缺点 - 它们在需要时不会动态地改变它们的大小。因此,在这种情况下,您应该使用动态数组来避免这种行为而不是静态数组。

所以我的建议是将你的布尔值存储在动态数组中(例如在List<Boolean>中),现在它会成为一种技巧。

1 在某些情况下非常&#34;整洁&#34;使用静态数组所以静态数组 - 它的结构并不差,但是你的目标不合适。