在我的申请中,我有ListView
和ArrayAdapter
。当我在ListView
中选择一个元素时,我还可以看到更多选定的元素。
此外,当我在ListView
中滚动元素(选择后)时,我的选择将消失,并且随机选择元素。
适配器代码:
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;
}
};
看起来必须设置一些参数。
你能帮我避免这个问题吗?
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()));
}
}
};
和simple_list_item_multiple_choice它是android sdk的文件:
<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"
/>
答案 0 :(得分:2)
ListView
面临的第一道障碍。别担心。首先要了解ListView
的工作原理,重要性。否则你无法掌握ListView
。最简单的说法是:ListView
创建几行View
并将其用于每一行。因此,如果您的ListView
中有50个元素,则可能只有10次getView()
调用convertView为null。所以简而言之,如果你没有为每个位置更新getView()
方法内的视图状态,那将真的是一个混乱。另请使用ListView
中的查看持有人模式。它将大大增加滚动并将使用更少的资源。有关查看持有人模式的更多信息http://www.jmanzano.es/blog/?p=166
<强>更新强>
我说
因此,如果你不为每个位置更新
getView()
方法内的视图状态,那么它实际上就是一个混乱。
private SparseBooleanArray checkedPositions = new SparseBooleanArray();// class variable
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(checkedPositions.get(position)){
checkedPositions.put(position, false);
}else{
checkedPositions.put(position, true);
}
}
});
现在在您的getView()
((CheckedTextView)convertView.findViewById(R.id.checkedTextView)).setChecked(checkedPositions.get(position));
根据您的需要调整此代码。 OR 您可以在BinLocation
中设置一个布尔变量来维护已检查的位置。但要记住并理解在getView()
内保持状态的重点。