【问题标题】:Selector not working for ListView inside a fragment选择器不适用于片段内的 ListView
【发布时间】:2015-01-26 18:32:53
【问题描述】:

我正在尝试使用selector 突出显示我的ListView 中的选定行。在我发布新闻后,我需要它保持突出显示。符号化突出显示的行是选定的行。

目前文本默认更改颜色。我需要更改背景颜色。

我在DrawerLayout 内部的片段中有ListView。当我选择一个设备时,DrawerLayout 关闭。当我再次打开DrawerLayout 时,我选择的设备的背景没有改变。所选设备的文本是不同的颜色,但不是背景。

我在这里尝试了很多关于 SO 的建议,但没有发现任何可行的方法。我的目标是 API-17,minsdk 是 API-17。

这是我尝试过的一些帖子,但没有成功。

如果您需要更多详细信息,请告诉我,谢谢。

这是我的代码(我尝试的最后一件事):

device_list_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/device_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:choiceMode="singleChoice"
    android:background="@drawable/device_selector" >
</ListView>

device_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_activated="true"
        android:drawable="@drawable/device_selected"/>
    <item
        android:drawable="@drawable/device_not_selected"/>
</selector>

strings.xml
<drawable name="device_selected">#777777</drawable>
<drawable name="device_not_selected">#555555</drawable>

DeviceListFragment
public class DeviceListFragment extends Fragment implements OnItemClickListener {
    public View onCreateView(...) {
        View view = inflater.inflate(R.layout.device_list_fragment, container, false);
                this.devicesArrayAdapter = new DevicesArrayAdapter(this.getActivity());

        this.deviceListView = (ListView) view.findViewById(R.id.device_list_view);
        this.deviceListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        this.deviceListView.setAdapter(this.devicesArrayAdapter);
        this.deviceListView.setOnItemClickListener(this);

        return view;
    }

    public void onItemClick(...) {
        this.deviceListView.setItemChecked(position, true);
    }
}

DevicesArrayAdapter
public class DevicesArrayAdapter extends ArrayAdapter<Device> {
    public View getView(...) {
        View rowView = layoutInflater.inflate(R.layout.device_element, parent, false);
        return rowView;
    }
}

【问题讨论】:

    标签: android android-listview android-selector


    【解决方案1】:

    您的适配器是问题所在 - 您只能膨胀视图并将其返回。如果您希望视图的背景保持不同的颜色,您应该设置一个标志来指示是否应该更改 rowView。稀疏数组是一种很好的方法。否则,每次你 显示DevicesArrayAdapter,它得到默认视图,没有背景变化。

    类似这样的:

    getView(...) {
        View rowView = layoutInflater.inflate(R.layout.device_element, parent, false);
    
        If (arrayViews[position] == CHANGE_BACKGROUND){
    
             rowView.setBackground = NEW_COLOR;
        }
    
        return rowView;
    }
    

    【讨论】:

    • 我认为选择器的目的是根据所做的选择来帮助更改视图的某些部分?仅使用选择器不会让更改持续存在?
    • 好的。我已经做到了。这对我有用的唯一方法是在onItemClick() 方法中调用myArrayAdapter.notifyDataSetChanged();。这是正确的吗?
    • 我决定采用我已经拥有的与此解决方案类似的解决方案。这不是我所期望的,但它现在可以工作。谢谢
    【解决方案2】:

    在您的 DeviceFragment 中更改

    public void onItemClick(...) {
        this.deviceListView.setItemChecked(position, true);
    }
    

    public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
        view.setSelected(true);
    }
    

    【讨论】:

    • 我已经试过了,还是不行。这是我尝试过的与此答案相关的帖子stackoverflow.com/a/16190228/427763
    • 也试试这个 在你的 device_selector.xml 中改变 android:state_activated="true" 到 android:state_selected="true"
    • 我已经试过了,还是不行。如果您查看我在之前的评论中链接的帖子,您将看到我为尝试使其正常工作所做的确切更改。它仍然未能坚持亮点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多