我可以在导航抽屉片段中更改单击我的recyclerview的行的imageview的文本颜色和背景.
但我的问题是在点击第4项后,第1项也被选中.点击我的第5项后,选择了第2项.
我该如何解决这个问题?那么一次只选择一个项目?
FragmentDrawer.java
public class FragmentDrawer extends Fragment { private static String TAG = FragmentDrawer.class.getSimpleName(); private RecyclerView recyclerView; private ActionBarDrawerToggle mDrawerToggle; private DrawerLayout mDrawerLayout; private NavigationDrawerAdapter adapter; private View containerView; private static String[] titles = null; private FragmentDrawerListener drawerListener; public FragmentDrawer() { } public void setDrawerListener(FragmentDrawerListener listener) { this.drawerListener = listener; } public static List<NavDrawerItem> getData() { List<NavDrawerItem> data = new ArrayList<>(); int[] icons = {R.drawable.ic_home,R.drawable.ic_upcoming,R.drawable.ic_saved,R.drawable.ic_wehappened,R.drawable.ic_persons,R.drawable.ic_music,R.drawable.ic_parties,R.drawable.ic_art,R.drawable.ic_network,R.drawable.ic_sports}; // preparing navigation drawer items for (int i = 0; i < titles.length && i < icons.length; i++) { NavDrawerItem navItem = new NavDrawerItem(); navItem.setTitle(titles[i]); navItem.setIcon(icons[i]); data.add(navItem); } return data; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // drawer labels titles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels); } @Override 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())); List<SimpleSectionedRecyclerViewAdapter.Section> sections = new ArrayList<SimpleSectionedRecyclerViewAdapter.Section>(); //Sections sections.add(new SimpleSectionedRecyclerViewAdapter.Section(5,"Categories")); 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); } @Override public void onLongClick(View view,int position) { } })); SimpleSectionedRecyclerViewAdapter.Section[] dummy = new SimpleSectionedRecyclerViewAdapter.Section[sections.size()]; SimpleSectionedRecyclerViewAdapter mSectionedAdapter = new SimpleSectionedRecyclerViewAdapter(getContext(),R.layout.section,R.id.section_text,adapter); mSectionedAdapter.setSections(sections.toArray(dummy)); //Apply this adapter to the RecyclerView recyclerView.setAdapter(mSectionedAdapter); return layout; } public void setUp(int fragmentId,DrawerLayout drawerLayout,final Toolbar toolbar) { containerView = getActivity().findViewById(fragmentId); mDrawerLayout = drawerLayout; mDrawerToggle = new ActionBarDrawerToggle(getActivity(),drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close) { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); getActivity().invalidateOptionsMenu(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); getActivity().invalidateOptionsMenu(); } @Override public void onDrawerSlide(View drawerView,float slideOffset) { super.onDrawerSlide(drawerView,slideOffset); toolbar.setAlpha(1 - slideOffset / 2); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); } public static interface ClickListener { public void onClick(View view,int position); public void onLongClick(View view,int position); } static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { private GestureDetector gestureDetector; private ClickListener clickListener; public RecyclerTouchListener(Context context,final RecyclerView recyclerView,final ClickListener clickListener) { this.clickListener = clickListener; gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(),e.getY()); if (child != null && clickListener != null) { clickListener.onLongClick(child,recyclerView.getChildPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView rv,MotionEvent e) { View child = rv.findChildViewUnder(e.getX(),e.getY()); if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { clickListener.onClick(child,rv.getChildPosition(child)); } return false; } @Override public void onTouchEvent(RecyclerView rv,MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } public interface FragmentDrawerListener { public void onDrawerItemSelected(View view,int position); } }
NavigationDrawerAdapter.java
public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> { List<NavDrawerItem> data = Collections.emptyList(); private LayoutInflater inflater; private Context context; public static int selected_item = 0; public NavigationDrawerAdapter(Context context,List<NavDrawerItem> data) { this.context = context; inflater = LayoutInflater.from(context); this.data = data; } public void delete(int position) { data.remove(position); notifyItemRemoved(position); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { View view = inflater.inflate(R.layout.nav_drawer_row,parent,false); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(MyViewHolder holder,int position) { if(position == selected_item) { holder.title.setTextColor(Color.parseColor("#00aaff")); holder.imgViewIcon.setBackgroundResource(R.drawable.ic_circle); } NavDrawerItem current = data.get(position); holder.title.setText(current.getTitle()); holder.imgViewIcon.setImageResource(current.getIcon()); } @Override public int getItemCount() { return data.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView title; public ImageView imgViewIcon; public MyViewHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.title); imgViewIcon = (ImageView) itemView.findViewById(R.id.item_icon); } } }
编辑:SimpleSectionedRecyclerViewAdapter.java
public class SimpleSectionedRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final Context mContext; private static final int SECTION_TYPE = 0; private boolean mValid = true; private int mSectionResourceId; private int mTextResourceId; private LayoutInflater mLayoutInflater; private RecyclerView.Adapter mBaseAdapter; private SparseArray<Section> mSections = new SparseArray<Section>(); public SimpleSectionedRecyclerViewAdapter(Context context,int sectionResourceId,int textResourceId,RecyclerView.Adapter baseAdapter) { mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mSectionResourceId = sectionResourceId; mTextResourceId = textResourceId; mBaseAdapter = baseAdapter; mContext = context; mBaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { mValid = mBaseAdapter.getItemCount()>0; notifyDataSetChanged(); } @Override public void onItemRangeChanged(int positionStart,int itemCount) { mValid = mBaseAdapter.getItemCount()>0; notifyItemRangeChanged(positionStart,itemCount); } @Override public void onItemRangeInserted(int positionStart,int itemCount) { mValid = mBaseAdapter.getItemCount()>0; notifyItemRangeInserted(positionStart,itemCount); } @Override public void onItemRangeRemoved(int positionStart,int itemCount) { mValid = mBaseAdapter.getItemCount()>0; notifyItemRangeRemoved(positionStart,itemCount); } }); } public static class SectionViewHolder extends RecyclerView.ViewHolder { public TextView title; public SectionViewHolder(View view,int mTextResourceid) { super(view); title = (TextView) view.findViewById(mTextResourceid); } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int typeView) { if (typeView == SECTION_TYPE) { final View view = LayoutInflater.from(mContext).inflate(mSectionResourceId,false); return new SectionViewHolder(view,mTextResourceId); }else{ return mBaseAdapter.onCreateViewHolder(parent,typeView -1); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder sectionViewHolder,int position) { if (isSectionHeaderPosition(position)) { ((SectionViewHolder)sectionViewHolder).title.setText(mSections.get(position).title); }else{ mBaseAdapter.onBindViewHolder(sectionViewHolder,sectionedPositionToPosition(position)); } } @Override public int getItemViewType(int position) { return isSectionHeaderPosition(position) ? SECTION_TYPE : mBaseAdapter.getItemViewType(sectionedPositionToPosition(position)) +1 ; } public static class Section { int firstPosition; int sectionedPosition; CharSequence title; public Section(int firstPosition,CharSequence title) { this.firstPosition = firstPosition; this.title = title; } public CharSequence getTitle() { return title; } } public void setSections(Section[] sections) { mSections.clear(); Arrays.sort(sections,new Comparator<Section>() { @Override public int compare(Section o,Section o1) { return (o.firstPosition == o1.firstPosition) ? 0 : ((o.firstPosition < o1.firstPosition) ? -1 : 1); } }); int offset = 0; // offset positions for the headers we're adding for (Section section : sections) { section.sectionedPosition = section.firstPosition + offset; mSections.append(section.sectionedPosition,section); ++offset; } notifyDataSetChanged(); } public int positionToSectionedPosition(int position) { int offset = 0; for (int i = 0; i < mSections.size(); i++) { if (mSections.valueAt(i).firstPosition > position) { break; } ++offset; } return position + offset; } public int sectionedPositionToPosition(int sectionedPosition) { if (isSectionHeaderPosition(sectionedPosition)) { return RecyclerView.NO_POSITION; } int offset = 0; for (int i = 0; i < mSections.size(); i++) { if (mSections.valueAt(i).sectionedPosition > sectionedPosition) { break; } --offset; } return sectionedPosition + offset; } public boolean isSectionHeaderPosition(int position) { return mSections.get(position) != null; } @Override public long getItemId(int position) { return isSectionHeaderPosition(position) ? Integer.MAX_VALUE - mSections.indexOfKey(position) : mBaseAdapter.getItemId(sectionedPositionToPosition(position)); } @Override public int getItemCount() { return (mValid ? mBaseAdapter.getItemCount() + mSections.size() : 0); } }
解决方法
将NavigationDrawerAdapter.java的onBindViewHolder方法更改为:
@Override public void onBindViewHolder(MyViewHolder holder,int position) { if(position == selected_item) { holder.title.setTextColor(Color.parseColor("#00aaff")); holder.imgViewIcon.setBackgroundResource(R.drawable.ic_circle); } else { holder.title.setTextColor(Color.parseColor("#00000")); //actually you should set to the normal text color holder.imgViewIcon.setBackgroundResource(0); } NavDrawerItem current = data.get(position); holder.title.setText(current.getTitle()); holder.imgViewIcon.setImageResource(current.getIcon()); }