In my application I have a ListView
and ArrayAdapter
. When I select some one element in ListView
I can see also few more selected elements.
Furthermore, when I scroll elements in ListView
(after selection) then my selection disappears and elements are selected randomly.
Code of adapter:
final ListAdapter adapter = new ArrayAdapter<BinLocationsComponent>(activity, R.layout.simple_list_item_multiple_choice, locationComponents) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if ( convertView == null ) {
convertView = layoutInflater.inflate(layout.simple_test_layout_with_one_text_field, null);
}
return convertView;
}
};
Looks like some parameters have to be set.
Could you please help me to avoid this problem?
UPD1
final ListAdapter adapter = new ArrayAdapter<BinLocationsComponent>(activity, R.layout.simple_list_item_multiple_choice, locationComponents) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final LocationsViewHolder viewHolder;
if ( convertView == null ) {
convertView = layoutInflater.inflate(layout.rp_bin_locations_block_element, parent, false);
viewHolder = new LocationsViewHolder();
viewHolder.init(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (LocationsViewHolder) convertView.getTag();
}
final BinLocation binLocation = locationComponents.get(position).getBinLocation();
if ( binLocation != null ) {
viewHolder.provideValues(binLocation);
}
return convertView;
}
class LocationsViewHolder {
TextView stationName;
TextView rackName;
TextView binName;
TextView volume;
NumberPicker numberOfItems;
public void init(View view) {
stationName = (TextView) view.findViewById(id.ro_station_name);
rackName = (TextView) view.findViewById(id.ro_rack_name);
binName = (TextView) view.findViewById(id.ro_bin_name);
volume = (TextView) view.findViewById(id.ro_volume_value);
numberOfItems = (NumberPicker) view.findViewById(id.ro_number_of_items);
}
public void provideValues(BinLocation location) {
stationName.setText(location.getStationName());
rackName.setText(location.getRackName());
binName.setText(location.getBinName());
volume.setText(valueOf(location.getVolume()));
}
}
};
and simple_list_item_multiple_choice it's android sdk's file:
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
/>
Wow, its the first hurdle you face in your first
ListView
. Don't worry. First of all understand howListView
works, its important. Otherwise you can't masterListView
. In simplest word:ListView
creates few rowView
s and utilizes them for every row. So if you have have 50 elements in yourListView
then may be only 10 timesgetView()
was called with convertView being null. So in short if you don't update the state of a view insidegetView()
method for every position, it will really be a chaos. Also please use View Holder Pattern in yourListView
. It will drastically increase scrolling and will utilize less resources. More on View Holder Pattern http://www.jmanzano.es/blog/?p=166UPDATE:
I said
now in your
getView()
adjust this code according to your need. OR you can have a boolean variable in your
BinLocation
to maintain checked positions. But remember and understand the point of maintaining state insidegetView()
.