我创建了一个带有复选框的自定义适配器。 复选框的状态存储在一个布尔数组中,其大小在适配器中定义。
我在异步任务的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;
}
}
如何处理布尔数组不会增加的事实?
答案 0 :(得分:1)
如何处理布尔数组不会增加的事实?
这是静态数组 1 的主要缺点 - 它们在需要时不会动态地改变它们的大小。因此,在这种情况下,您应该使用动态数组来避免这种行为而不是静态数组。
所以我的建议是将你的布尔值存储在动态数组中(例如在List<Boolean>
中),现在它会成为一种技巧。
1 在某些情况下非常&#34;整洁&#34;使用静态数组所以静态数组 - 它的结构并不差,但是你的目标不合适。