Я не совсем уверен, есть ли стандартное решение в Android, но это должно сработать:
public class AppsArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private List<Integer> checkedItems;//Here we save the position of the selected items.
private final String DefaultApps = "def_apps";
//This will be invoked when one of the CheckBoxes gets clicked. It will update the checkedItems list.
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer position = (Integer) v.getTag();
if(checkedItems.contains(position)) checkedItems.remove(position);
else checkedItems.add(position);
}
};
public AppsArrayAdapter(Context context, String[] values, List<Integer> checkedItems) {//XXX
super(context, R.layout.apps, values);
this.context = context;
this.checkedItems = checkedItems;//XXX
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SharedPreferences myPrefsApps =context.getSharedPreferences("myPrefsApps", Context.MODE_PRIVATE);
String prefNameDefaultApps = myPrefsApps.getString(DefaultApps, "");
//You shouldn't inflate the View everytime getView() is called,
/*LayoutInflater inflater = (LayoutInflater)context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.apps, parent, false);*/
//rather let the superclass handle it as it's more efficient.
View rowView = super.getView(position, convertView, parent);
TextView text_apps = (TextView)rowView.findViewById(R.id.text_apps);
CheckBox check = (CheckBox)rowView.findViewById(R.id.check_apps);
text_apps.setText(prefNameDefaultApps.split("\n")[position]);
check.setChecked(checkedItems.contains((Integer) position));//XXX
check.setTag((Integer) position);//XXX
check.setOnClickListener(onClickListener);//XXX
return rowView;
}
}
В поле ListActivity
добавьте полеprivate List<Integer> checkedItems = new ArrayList<Integer>;
.Вы должны передать этот список в конструкторе адаптера!Если вы хотите проверить, был ли выбран n-й элемент в вашем ListView
, просто посмотрите, сохранен ли n в параметре checkItems, т.е.
if(checkedItems.contains(requestedItemPosition)) {
//Item was selected.
} else {
//Item was not selected.
}
. Я действительно рекомендую вам не раздувать представления самостоятельно.