Das Problem kann leicht gelöst werden, indem man CheckBox
Staaten hält. Ein selbst definiert und erklärte vollständigen Beispielklassencode für das gleiche ist wie below_
public class AreaDataAdapter extends ArrayAdapter<String> {
private List<String> areaList;
private Activity context;
ArrayList<Boolean> positionArray;
public AreaDataAdapter(Context context, int textViewResourceId,
List<String> offersAreaList) {
super(context, textViewResourceId, offersAreaList);
// TODO Auto-generated constructor stub
this.context=context;
this.areaList = offersAreaList;
positionArray = new ArrayList<Boolean>(offersAreaList.size());
for(int i =0;i<offersAreaList.size();i++){
positionArray.add(false);
}
}
public AreaDataAdapter(Activity context, List<String> offersAreaList) {
super(ShowOffersActivity.this, R.layout.filterlist_row, offersAreaList);
this.context=context;
this.areaList=offersAreaList;
positionArray = new ArrayList<Boolean>(offersAreaList.size());
for(int i =0;i<offersAreaList.size();i++){
positionArray.add(false);
}
}
public View getView(final int position, View convertView,ViewGroup parent) {
View row=convertView;
FilterViewHolder holder;
if (row==null) {
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.filterlist_row, parent, false);
holder = new FilterViewHolder();
holder.filterCheckBox = (CheckBox)row.findViewById(R.id.filter_checkbox);
holder.filterCheckBox.setTypeface(fontFace);
row.setTag(holder);
} else {
//holder = (View) row;
holder = (FilterViewHolder) row.getTag();
/* When a listview recycles views , it recycles its present state as well as listeners attached to it.
* if the checkbox was checked and has a onCheckedChangeListener set, both will remain a part of
* recycled view based on position. So it is our responsibility to reset all states and remove
* previous listeners.
* The listener was removed as below:-
*/
holder.filterCheckBox.setOnCheckedChangeListener(null);
}
holder.filterCheckBox.setText(areaList.get(position));
holder.filterCheckBox.setFocusable(false);
holder.filterCheckBox.setChecked(positionArray.get(position));
holder.filterCheckBox.setText(areaList.get(position));
holder.filterCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
//change state of concern item in 'positionArray' array to 'True'
positionArray.set(position, true);
//add the checked item in to area list which used to filter offers.
filterOffersByThisAreaList.add(areaList.get(position));
} else {
//change state of concern item in 'positionArray' array to 'True'
positionArray.set(position, true);
//remove the unchecked item in to area list which used to filter offers.
filterOffersByThisAreaList.remove(areaList.get(position));
}
}
});
return row;
}
}
Individuelle Row (filterlist_row)
für die ListView
diesen CheckBox
s enthält, als below_
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<CheckBox
android:id="@+id/filter_checkbox"
style="@style/CodeFont"
android:button="@drawable/bg_custom_checkbox"
android:text="Indian" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#c9c9c3" />
</LinearLayout>
CheckBox
backgroung gestalten ist als below_
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/checkbox_s" android:state_checked="true"></item>
<item android:drawable="@drawable/checkbox_ns" android:state_checked="false"></item>
</selector>
OK, also ging ich mit Option eins. Kurz bevor ich die Ansicht in getView zurückgebe, mache ich "checkBox.setChecked (false);". Wenn ich jetzt ein Kontrollkästchen ankreuze, scrolle ich nach unten und scrolle nach oben, es wird nicht mehr überprüft. Ich weiß, dass das Problem bei meiner Implementierung liegt und nicht bei Ihrem Konzept. Was mache ich falsch? –
Wenn der Benutzer das Kontrollkästchen aktiviert, müssen Sie das Kontrollkästchen des Elements aktiviert haben, irgendwo in Ihrem Code. Wenn Sie beispielsweise 40 Elemente in Ihrem ListView-Objekt haben, können Sie ein Array mit booleschen Werten zum Speichern verwenden, wenn ein Kontrollkästchen für i-th aktiviert ist. Dann auf "getView", CheckBox.setChecked (booleanArray [Position]). – yuku
Vielleicht ist es, weil es so spät in der Nacht ist, aber ich kann nicht herausfinden, wie man die Position tatsächlich aufzeichnet. In der getView-Methode kann ich die Position haben, aber im OnClick, wo ich die Position tatsächlich speichern muss, habe ich keinen Zugriff mehr darauf. –