ListView项目中的setBackgroundColor为多个项目着色

时间:2018-07-23 16:51:02

标签: android listview

我在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);
        }

        }
    }
);

这里是我单击 CS 18000-问题解决和面向对象编程的示例: CS180 Selected

但是,当我向下滚动时,我还会看到另一种颜色: Random item colored

1 个答案:

答案 0 :(得分:0)

这是因为listView的回收机制。

Listview正在回收用于渲染项目的相同视图!您可以使用自定义适配器,并将选定的视图位置存储在某个变量中。然后在适配器的onCreateView()方法中,您将检查selectItem和当前项目的位置(如果它们相等),然后将背景设置为视图,否则从视图中删除背景。

您可以在网上搜索为listView创建自定义适配器的例子。