`我是android的新手并构建一个列表,该列表包含已安装的应用程序名称和CheckBox,以选择要卸载哪个。例如,问题是当列表变得比电话屏幕更长并且滚动是活动的时候;当我选中一个复选框时,会在列表底部自动选择第二个复选框。
问题是复选框的自动复选框选择,plz帮助我。
public View getView(final int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = context.getLayoutInflater();
if (convertView == null) {
convertView = inflater.inflate(R.layout.ultimate, null);
holder = new ViewHolder();
holder.apkName = (TextView) convertView.findViewById(R.id.appName);
holder.apkInstall=(TextView)convertView.findViewById(R.id.appMemory);
holder.cb=(CheckBox)convertView.findViewById(R.id.cb);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
PackageInfo packageInfo = (PackageInfo) getItem(position);
Drawable appIcon = packageManager.getApplicationIcon(packageInfo.applicationInfo);
String appName = packageManager.getApplicationLabel( packageInfo.applicationInfo).toString();
appIcon.setBounds(0, 0, 50, 50);
holder.apkName.setCompoundDrawables(appIcon, null, null, null);
holder.apkName.setCompoundDrawablePadding(15);
holder.apkName.setText(appName);
holder.cb.setTag(position);
答案 0 :(得分:1)
为此,您必须将已选中的复选框状态保存到Model Class的ArrayList中。它将反映到您的适配器,然后进入列表视图。首先制作如下的模型类,
public class Model{
String name;
int value; /* 0 -> checkbox disable, 1 -> checkbox enable */
Model(String name, int value){
this.name = name;
this.value = value;
}
public String getName(){
return this.name;
}
public int getValue(){
return this.value;
}
}
然后在您的适配器中使您的代码看起来像这样,
public class CustomAdapter extends ArrayAdapter<Model>{
Model[] modelItems = null;
Context context;
public CustomAdapter(Context context, Model[] resource) {
super(context,R.layout.row,resource);
// TODO Auto-generated constructor stub
this.context = context;
this.modelItems = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
convertView = inflater.inflate(R.layout.row, parent, false);
TextView name = (TextView) convertView.findViewById(R.id.textView1);
CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
name.setText(modelItems[position].getName());
if(modelItems[position].getValue() == 1)
cb.setChecked(true);
else
cb.setChecked(false);
return convertView;
}
}
现在从您的活动中将复选框列表传递到适配器,如下所示:
lv = (ListView) findViewById(R.id.listView1);
modelItems = new Model[5];
modelItems[0] = new Model("pizza", 0);
modelItems[1] = new Model("burger", 1);
modelItems[2] = new Model("olives", 1);
modelItems[3] = new Model("orange", 0);
modelItems[4] = new Model("tomato", 1);
CustomAdapter adapter = new CustomAdapter(this, modelItems);
lv.setAdapter(adapter);
现在,如果用户选中/取消选中任何复选框,只需更改其模型类中的值并通知适配器。
答案 1 :(得分:1)
每当需要显示列表视图项时滚动列表视图,它将调用getView来创建或获取布局。因此,您需要在模型类中使用布尔变量检查是否已检查,并根据boolan值使复选框视图处于选中状态。当用户选中复选框时,您应该更新模型的布尔值。
您的模型类应包含一个变量,表示是否选中该复选框。
public class Model{
.....
boolean isChecked; //true if checkbox is checked
.....
}
在你的适配器类中,在getView()中。
您应该使用isChecked
变量检查是否已选中。
if(isChecked){
holder.cb.setChecked(true);
} else {
holder.cb.setChecked(false);
}