选择器不适用于片段内的 ListView
Selector not working for ListView inside a fragment
我正在尝试使用 selector
在我的 ListView
中突出显示 selected 行。我需要它在我发布新闻后保持突出显示。符号突出显示的行是行 selected.
目前文本默认改变颜色。我需要更改背景颜色。
我在 DrawerLayout
内的片段中有 ListView
。当我 select 一个设备时, DrawerLayout
关闭。当我再次打开 DrawerLayout
时,我 select 编辑的设备的背景没有改变。设备的文本 selected 颜色不同,但背景颜色不同。
我在这里尝试了很多关于 SO 的建议,但没有找到任何有效的方法。我的目标是 API-17,minsdk 是 API-17.
以下是我试过但没有成功的一些帖子。
- ListView Item Selected State not working
- Change background color of selected item on a ListView
- Android ListView selected item stay highlighted
如果您需要更多详细信息,请告诉我,谢谢。
这是我的代码(我最后尝试的代码):
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;
}
}
您的适配器是问题所在 - 您只膨胀视图并 return 它。如果您希望视图的背景保持不同的颜色,您应该设置一个标志来指示是否应更改 rowView。稀疏数组是执行此操作的好方法。否则,你每次
显示 DevicesArrayAdapter,它获得默认视图,没有背景变化。
像这样:
getView(...) {
View rowView = layoutInflater.inflate(R.layout.device_element, parent, false);
If (arrayViews[position] == CHANGE_BACKGROUND){
rowView.setBackground = NEW_COLOR;
}
return rowView;
}
在你的 DeviceFragment 中更改
public void onItemClick(...) {
this.deviceListView.setItemChecked(position, true);
}
至
public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
view.setSelected(true);
}
我正在尝试使用 selector
在我的 ListView
中突出显示 selected 行。我需要它在我发布新闻后保持突出显示。符号突出显示的行是行 selected.
目前文本默认改变颜色。我需要更改背景颜色。
我在 DrawerLayout
内的片段中有 ListView
。当我 select 一个设备时, DrawerLayout
关闭。当我再次打开 DrawerLayout
时,我 select 编辑的设备的背景没有改变。设备的文本 selected 颜色不同,但背景颜色不同。
我在这里尝试了很多关于 SO 的建议,但没有找到任何有效的方法。我的目标是 API-17,minsdk 是 API-17.
以下是我试过但没有成功的一些帖子。
- ListView Item Selected State not working
- Change background color of selected item on a ListView
- Android ListView selected item stay highlighted
如果您需要更多详细信息,请告诉我,谢谢。
这是我的代码(我最后尝试的代码):
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;
}
}
您的适配器是问题所在 - 您只膨胀视图并 return 它。如果您希望视图的背景保持不同的颜色,您应该设置一个标志来指示是否应更改 rowView。稀疏数组是执行此操作的好方法。否则,你每次 显示 DevicesArrayAdapter,它获得默认视图,没有背景变化。
像这样:
getView(...) {
View rowView = layoutInflater.inflate(R.layout.device_element, parent, false);
If (arrayViews[position] == CHANGE_BACKGROUND){
rowView.setBackground = NEW_COLOR;
}
return rowView;
}
在你的 DeviceFragment 中更改
public void onItemClick(...) {
this.deviceListView.setItemChecked(position, true);
}
至
public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
view.setSelected(true);
}