ListView Clicked项目突出显示无法正常工作

时间:2014-02-02 02:44:13

标签: android listview android-listview

我有一个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);
        }
    }

2 个答案:

答案 0 :(得分:2)

updateView()功能中,您正在更改selectedListViewItem的背景颜色。到目前为止,一切都像你想象的那样,但是当你滚动的时候,即使你没有自己动手,另一行也会被“选中”。

这是由视图回收引起的,它是Listview适配器的一个功能,它允许它们通过从屏幕滚出一行来加载更快,用新数据填充并按原样显示(没有)需要再次从XML中扩充它。

基本上它会将您原来不在屏幕上的旧蓝色行放入,将新字符串放入其中并将其显示为新行。

修复它的方法是实现自己的Adapter并覆盖getView方法。有大量资源可以告诉你如何做到这一点。 Here is one

要记住的一件事是,一旦实施自定义适配器,就必须跟踪哪些项目已被点击,以便您可以正确地突出显示和重新突出显示项目。

答案 1 :(得分:0)

您正在更改所选项目的背景颜色,但未在适配器中重置它

尝试发布您的适配器代码

所以检入适配器getView方法

如果选择了项目   选定行的setBackgroudColor 其他   正常行的setBackgroundColor