我在Android Studio中有一个ListView,其中有20多个项目(这意味着有一个滚动条可以浏览它)。但是,当用户单击某个项目时,我的代码应该为选定的项目着色,但是它也会在列表中选择更远的另一个项目。
我的名单基本上是某所大学开设的几个班级的清单。
这是我的ListView
XML代码:
<ListView
android:id="@+id/class_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
这是我的onCreate
完整代码:
class_search = (ListView) findViewById(R.id.class_search);
final ArrayList<String> PurdueClasses = new ArrayList<>();
PurdueClasses.addAll(Arrays.asList(getResources().getStringArray(R.array.PurdueClasses)));
adapter = new ArrayAdapter<String>(
ClassSearch.this,
android.R.layout.simple_list_item_1,
PurdueClasses
);
class_search.setAdapter(adapter);
class_search.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
String name = adapterView.getItemAtPosition(position).toString();
if (!SelectedClassesNames.contains(name)){
Toast.makeText(getBaseContext(), "Item Selected!", Toast.LENGTH_SHORT).show();
SelectedClassesNames.add(name);
//I have tried both ways below and they both have the same problem I described
//view.setBackgroundColor(Color.BLUE);
class_search.getChildAt(position - class_search.getFirstVisiblePosition()).setBackgroundColor(Color.BLUE);
}
else {
Toast.makeText(getBaseContext(), "Item De-Selected", Toast.LENGTH_SHORT).show();
SelectedClassesNames.remove(name);
//I have tried both ways below and they both have the same problem I described
//view.setBackgroundColor(Color.BLUE);
class_search.getChildAt(position - class_search.getFirstVisiblePosition()).setBackgroundColor(Color.WHITE);
}
}
}
);
答案 0 :(得分:0)
这是因为listView
的回收机制。
Listview
正在回收用于渲染项目的相同视图!您可以使用自定义适配器,并将选定的视图位置存储在某个变量中。然后在适配器的onCreateView()
方法中,您将检查selectItem
和当前项目的位置(如果它们相等),然后将背景设置为视图,否则从视图中删除背景。
您可以在网上搜索为listView
创建自定义适配器的例子。