Android 列表选择器工作不正常
在我的应用程序中,我使用的是带有列表视图的导航抽屉。现在我想要的是,当用户选择列表项时,列表项的颜色应该改变,并且应该保持选中状态。通过一些研究,我可以将列表项更改为所需的颜色,但它不会保持选中状态 列表选择器.xmlAndroid 列表选择器工作不正常,android,listview,Android,Listview,在我的应用程序中,我使用的是带有列表视图的导航抽屉。现在我想要的是,当用户选择列表项时,列表项的颜色应该改变,并且应该保持选中状态。通过一些研究,我可以将列表项更改为所需的颜色,但它不会保持选中状态 列表选择器.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item androi
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true"
android:state_pressed="true" android:drawable="@color/pink" />
<item android:state_enabled="true"
android:state_focused="true" android:drawable="@color/pink" />
<item android:state_enabled="true"
android:state_selected="true" android:drawable="@color/pink" />
<item
android:drawable="@android:color/white" />
</selector>
ListView.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#fff"
android:layout_weight="3">
<ListView
android:id="@+id/lv_nav_items"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@android:color/transparent"
android:paddingBottom="05dp"></ListView>
</LinearLayout>
麦克利克代码
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
lvNavItems.setItemChecked(position, true);
lvNavItems.setSelection(position);
mDrawerLayout.closeDrawer(fragContainer);
}
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
lvNavItems.setItemChecked(位置,true);
lvNavItems.setSelection(职位);
mDrawerLayout.封闭抽屉(框架容器);
}
抽屉类
public class NavigationDrawerFrag extends MasterFragment implements AdapterView.OnItemClickListener {
private View view;
private View fragContainer;
private ActionBarDrawerToggle drawerToggle;
private DrawerLayout mDrawerLayout;
private List<NavItems> listNavItems;
private int[] icons = new int[]{R.drawable.ic_home_r, R.drawable.ic_profile, R.drawable.ic_celebrities, R.drawable.ic_verify, R.drawable.ic_about_us, R.drawable.ic_tc, R.drawable.ic_home, R.drawable.ic_home, R.drawable.ic_cancellation, R.drawable.ic_logout};
private int[] iconsColored = new int[]{R.drawable.ic_home, R.drawable.ic_profile_r, R.drawable.ic_celebrities_r, R.drawable.ic_verify_r, R.drawable.ic_about_us_r, R.drawable.ic_tc_r, R.drawable.ic_home_r, R.drawable.ic_home_r, R.drawable.ic_cancellation_r, R.drawable.ic_logout_r};
private String[] items;
private ListView lvNavItems;
private NavItemAdapter adapter;
public NavigationDrawerFrag() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.navigation_drawer_frag, container, false);
return view;
}
public void setUp(DrawerLayout drawerLayout, Toolbar toolbar, int fragId) {
fragContainer = getActivity().findViewById(fragId);
mDrawerLayout = drawerLayout;
drawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string.open, R.string.close) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActivity().invalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
getActivity().invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(drawerToggle);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
drawerToggle.syncState();
}
});
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
init();
}
private void init() {
lvNavItems = (ListView) view.findViewById(R.id.lv_nav_items);
items = getActivity().getResources().getStringArray(R.array.NavItems);
adapter = new NavItemAdapter(getActivity(), getListItems());
lvNavItems.setAdapter(adapter);
lvNavItems.setItemChecked(2, true);
lvNavItems.setSelection(2);
lvNavItems.setOnItemClickListener(this);
}
public List<NavItems> getListItems() {
listNavItems = new ArrayList<>();
for (int i = 0; i < icons.length && i < items.length; i++) {
NavItems navItems = new NavItems(items[i], icons[i]);
listNavItems.add(navItems);
}
return listNavItems;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CommonFunctions.replaceFragment(getActivity(), new ProfileFrag(), true);
lvNavItems.setItemChecked(position, true);
lvNavItems.setSelection(position);
mDrawerLayout.closeDrawer(fragContainer);
}
}
公共类NavigationDrawerFrag扩展主片段实现AdapterView.OnItemClickListener{
私人视野;
私有视图框架容器;
私人诉讼律师事务所;
私人抽屉布局mDrawerLayout;
私有列表列表项;
private int[]icons=new int[]{R.drawable.ic_home_R,R.drawable.ic_profile,R.drawable.ic_名人,R.drawable.ic_verify,R.drawable.ic_about_us,R.drawable.ic_tc,R.drawable.ic_home,R.drawable.ic_取消,R.drawable.ic_注销};
private int[]iconcolored=new int[]R.drawable.ic_home,R.drawable.ic_profile_R,R.drawable.ic_名人_R,R.drawable.ic_verify_R,R.drawable.ic_关于__R,R.drawable.ic_tc_R,R.drawable.ic_home_R,R.drawable.ic_home_ _R,R.drawable.ic_取消_,R.drawable.ic_注销};
私有字符串[]项;
私有列表视图lvNavItems;
专用适配器;
公共导航抽屉标签(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(右布局、导航、抽屉、容器、假);
返回视图;
}
公共空白设置(抽屉布局、工具栏、int fragId){
fragContainer=getActivity().findViewById(fragId);
mDrawerLayout=抽屉式布局;
抽屉切换=新建ActionBarDrawerToggle(getActivity(),mDrawerLayout,工具栏,R.string.open,R.string.close){
@凌驾
打开图纸上的公共空白(视图抽屉视图){
super.onDrawerOpened(抽屉视图);
getActivity().InvalidateOptions菜单();
}
@凌驾
图纸上的公共空白已关闭(视图抽屉视图){
super.onDrawerClosed(抽屉视图);
getActivity().InvalidateOptions菜单();
}
};
mDrawerLayout.setDrawerListener(抽屉切换);
mDrawerLayout.post(新的Runnable(){
@凌驾
公开募捐{
drawerToggle.syncState();
}
});
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
init();
}
私有void init(){
lvNavItems=(ListView)view.findViewById(R.id.lv\u导航项);
items=getActivity().getResources().getStringArray(R.array.NavItems);
adapter=new-NavItemAdapter(getActivity(),getListItems());
lvNavItems.setAdapter(适配器);
lvNavItems.setItemChecked(2,true);
lvNavItems.setSelection(2);
lvNavItems.setOnItemClickListener(this);
}
公共列表getListItems(){
listNavItems=newarraylist();
对于(int i=0;i
自定义列表项
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/list_selector"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_nav_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:padding="10dp"
android:src="@drawable/ic_home" />
<TextView
android:id="@+id/tv_nav_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/iv_nav_icon"
android:layout_toRightOf="@+id/iv_nav_icon"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="New Text"
android:textColor="#000"
android:textSize="@dimen/regular" />
</RelativeLayout>
请帮我找出哪里出错。您需要参考您的选择器: 做 而不是
android:listSelector="@android:color/transparent"
我假设在单击任何项目后,您关闭抽屉并显示一些屏幕。抽屉关闭时,listview会自动重置,并在抽屉再次打开时重新呈现 解决方案是保存所选索引,并在
getView
方法中为该索引的项设置所需的bg颜色
public static int NAV_CURR_SELECTION = 2; // you have used 2 in init()
NAV_CURR_SELECTION = position;
在onItemClick()方法中
onDrawerOpened()
onDrawerOpened()
中提到的两行。(仅更改步骤3。1和2需要保持不变)
试过了,但颜色仍然存在,但没有被选择。你能将选择器应用到每行的背景吗?我也这样做了,请看我的帖子。我已经更新了,请帮助我。谢谢:)我按照你说的做了,但仍然没有成功
public static int NAV_CURR_SELECTION = 2; // you have used 2 in init()
NAV_CURR_SELECTION = position;
lvNavItems.setItemChecked(NAV_CURR_SELECTION, true);
lvNavItems.setSelection(NAV_CURR_SELECTION);
View v = lvNavItems.getChildAt(NAV_CURR_SELECTION);
v.setBackgroundColor(0xFF00FF00); // or whatever color you need