选择器不适用于片段内的ListView

时间:2015-01-26 18:32:53

标签: android android-listview android-selector

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

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

我在ListView内的片段中有DrawerLayout。当我选择设备时,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;
    }
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

在您的DeviceFragment更改

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

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