导航抽屉(NavigationDrawer)RecyclerView选定项目更改颜色

3

你想在选择时更改项目[View]的文本颜色吗?这是你想要的吗? - capt.swag
感谢您的快速回复。我想要更改文本颜色,如果可能的话,还需要更改导航抽屉行布局。 - AngelJanniee
在适配器中为您的TextView设置点击监听器。然后,您可能需要编写一个接口,以便您的活动知道您已单击了TextView。在接口的方法中更改TextView的颜色,然后调用notifydatasetchanged。 - user765
如果我为TextView设置了监听器,这里添加的代码不会有任何作用。textview.setTextColor(context.getResources().getColor(android.R.color.holo_green_light)); textview.setTypeface(Typeface.DEFAULT_BOLD);notifyDataSetChanged();你能解释一下吗? - AngelJanniee
3个回答

8
在 NavigationDrawerAdapter 类中定义一个静态整数以表示所选项目。
在 NavigationDrawerAdapter.java 文件中。
public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> {
    public static int selected_item = 0;
    ...

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        NavDrawerItem current = data.get(position);
        holder.title.setText(current.getTitle());
        if(position == selected_item)
        {
            holder.title.setTextColor(Color.RED);
        }
        else
        {
            holder.title.setTextColor(Color.BLACK);
        }
    }

    ...

}

在FragmentDrawer.java中
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ...
    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {

            NavigationDrawerAdapter.selected_item = position;
            recyclerView.getAdapter().notifyDataSetChanged();
            drawerListener.onDrawerItemSelected(view, position);
            mDrawerLayout.closeDrawer(containerView);
        }

        ...
    }));

    ...
}

现在它正常工作了,谢谢@charagjn。但是当我返回滑块时,我可以看到更改,但是当我单击该项时无法看到。你能提供一些想法吗?谢谢。 - AngelJanniee
1
在调用 notifyDataSetChanged() 后,编辑完成后请将关闭抽屉。 - chiragjn

1
我已经找到了如何更改文本颜色以及整个视图的颜色。
我已更新你的FragmentDrawer.java文件。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflating view layout
    View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);

    adapter = new NavigationDrawerAdapter(getActivity(), getData());
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {
            view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
            ((TextView) view.findViewById(R.id.title)).setTextColor(getResources().getColor(R.color.material_blue_grey_800));
            drawerListener.onDrawerItemSelected(view, position);
            mDrawerLayout.closeDrawer(containerView);
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

    return layout;
}

我所做的基本上是在TouchListener的onClick()方法中。
view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));

这将更改视图的背景颜色。
同样,由于我引用了该视图,我可以获取对抽屉布局中使用的TextView的引用。
((TextView) view.findViewById(R.id.title)).setTextColor(getResources().getColor(R.color.material_blue_grey_800));

2
是的,它正在改变,但其他项目应该保持先前的颜色。如果我点击这些项目,则它们将一个接一个地更改为相同的颜色。只需要更改定位项目,而不需要处理如何更改? - AngelJanniee

0
你可以这样做:
public class MainActivity extends AppCompatActivity {

    .......

     adapter.setOnItemClickLister(new MenuAdapter.OnItemSelecteListener() {

        View selectedView;

        @Override
        public void onItemSelected(View v, int position) {

            if(selectedView != null)
                selectedView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.defaultColor));

            v.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.orange));

            selectedView = v;
        }
    });


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接