Android 列表选择器工作不正常

Android 列表选择器工作不正常,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

<?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