我有一个ListView,并为此ListView提供了一个onClickListener。 ListView正在使用SimpleAdapter,并通过地图填充数据。
每当单击Item时,该List Item将突出显示。 但问题是,假设我单击列表上的第4项并滚动列表,然后突出显示每个第4个元素。我正在使用Selector xml来实现突出显示功能
我知道问题是由于屏幕刷新造成的。
但我怎样才能避免这个问题呢? 现在搜索大约一个月的答案。我现在需要一个解决方案。
提前致谢。
Selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/drawer_icon_normal" android:state_selected="false" android:state_pressed="false"/>
<item android:drawable="@drawable/drawer_icon_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/drawer_icon_activated" android:state_selected="true"/>
</selector>
下面是填充listView和onclick功能的代码。 //注意这段代码没有使用选择器,这段代码也是如此,功能相同。
public void populateListView() {
//Populate the List View Here
//Set the adapter
SimpleAdapter flvadapter = new SimpleAdapter(getActivity(), finalSongList, android.R.layout.simple_list_item_1, new String[]{"filename"}, new int[]{android.R.id.text1});
fileListView.setAdapter(flvadapter);
fileListView.setBackgroundColor(Color.WHITE);
fileListView.setTextFilterEnabled(true);
fileListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
//Registering the OnItemClicklistener
fileListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
//TODO Auto-generated method stub
//fileListView.getItemAtPosition(position);
updateView(position);
index = position;
@SuppressWarnings("unchecked")
HashMap<String, String> hm = (HashMap<String, String>) fileListView.getItemAtPosition(position);
if (hm.get("fileuri") == null) {
AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
adb.setTitle("ListView OnClick");
adb.setMessage("Selected Item is = " + hm.get("fileuri"));
adb.setPositiveButton("Ok", null);
adb.show();
} else {
//Processing the Selected File
}
}
});
}
private void updateView(int index){
//View v=fileListView.getChildAt(index-fileListView.getFirstVisiblePosition());
selectedListViewItem=fileListView.getChildAt(index);
fileListView.setBackgroundColor(Color.WHITE);
if (selectedListViewItem != null) {
selectedListViewItem.setBackgroundColor(Color.CYAN);
}
}
答案 0 :(得分:2)
在updateView()
功能中,您正在更改selectedListViewItem
的背景颜色。到目前为止,一切都像你想象的那样,但是当你滚动的时候,即使你没有自己动手,另一行也会被“选中”。
这是由视图回收引起的,它是Listview
适配器的一个功能,它允许它们通过从屏幕滚出一行来加载更快,用新数据填充并按原样显示(没有)需要再次从XML中扩充它。
基本上它会将您原来不在屏幕上的旧蓝色行放入,将新字符串放入其中并将其显示为新行。
修复它的方法是实现自己的Adapter并覆盖getView方法。有大量资源可以告诉你如何做到这一点。 Here is one
要记住的一件事是,一旦实施自定义适配器,就必须跟踪哪些项目已被点击,以便您可以正确地突出显示和重新突出显示项目。
答案 1 :(得分:0)
您正在更改所选项目的背景颜色,但未在适配器中重置它
尝试发布您的适配器代码
所以检入适配器getView方法
如果选择了项目 选定行的setBackgroudColor 其他 正常行的setBackgroundColor