RecyclerView高级用法
之前写了个RecyclerView的使用方法与如何设置点击监听,后来群里有个人问我如何在点击item的时候为item添加图片,并在点击其他item的时候,新的item里添加图片,之前的item里的图片消失。听起来很简单,但实际。。。
网上找了点例子看了下,都不太满意,而且写的比较繁琐,还是自己动手吧。。。
点击后给item添加图片,这个简单,但是点击下一个item的时候如何让上一个item还原呢?其实这个也还不算难,关键是如何解决上下滑动的图片混乱问题。。。
折腾了一个上午才做好。。。下面上源码:
主布局:左边是个竖直方向列表,右边是个3排的瀑布流
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"/><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView2"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"/></LinearLayout>
item:
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:drawableTop="@android:drawable/btn_star_big_on"android:text="1111111"/><ImageViewandroid:id="@+id/p_w_picpathView"android:visibility="gone"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/ok"/></LinearLayout>
MainActivity:
publicclassMainActivityextendsAppCompatActivity{privateRecyclerViewrecyclerView;privateRecyclerViewrecyclerView2;privateMyAdapteradapter;privateString[]ibsValue={"直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111","直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111","直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111","直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111","直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111","直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111","直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111","直播1111111111","番剧111111111111","动画1111111111111111111111111111111111111111111","音乐","舞蹈","游戏","科技","娱乐111111111111111","鬼畜111111111111111","电影1111111111","电视剧1111111","游戏中心11111111111"};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView=(RecyclerView)findViewById(R.id.recyclerView);recyclerView2=(RecyclerView)findViewById(R.id.recyclerView2);/***设置固定尺寸*/recyclerView.setHasFixedSize(false);recyclerView2.setHasFixedSize(false);/***想用线性布局就用这个*/LinearLayoutManagerlinearLayoutManager=newLinearLayoutManager(this);/***如果用线行布局的话,可以设置垂直/横向*///linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);/***想用网格布局就用这个*///GridLayoutManagergridLayoutManager=newGridLayoutManager(this,2);/***想用瀑布流布局就用这个*///StaggeredGridLayoutManagerstaggeredGridLayoutManager=newStaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);StaggeredGridLayoutManagerstaggeredGridLayoutManager1=newStaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);/***在这里选择排列布局(用哪个就放进来就行了)*/recyclerView.setLayoutManager(linearLayoutManager);recyclerView2.setLayoutManager(staggeredGridLayoutManager1);/***设置适配器*/adapter=newMyAdapter(ibsValue);recyclerView.setAdapter(adapter);recyclerView2.setAdapter(newMyAdapter(ibsValue));}}
Adapter:
publicclassMyAdapterextendsRecyclerView.Adapter<MyAdapter.ViewHolder>implementsView.OnClickListener{publicList<ViewHolder>listViewHolder=newArrayList<ViewHolder>();/***这里创建一个数组,准备接收传过来的数据*/publicString[]datas;/***这里调用在创建MyAdapter实例的时候,可以将数据传过来*@parammdatas*/publicMyAdapter(String[]mdatas){datas=mdatas;}/***这里加载加载Item,并且创建ViewHolder对象,把加载的Item(View)传给viewholder*@paramparent*@paramviewType*@return*/@OverridepublicViewHolderonCreateViewHolder(ViewGroupparent,intviewType){//这里加载itemViewview=LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);//这里创建ViewHolder,并把view传过去,与viewholder绑定ViewHolderviewHolder=newViewHolder(view,parent.getContext());//这里设置item的点击监听view.setOnClickListener(this);//这里设置标签view.setTag(viewHolder);returnviewHolder;}/***这里给item中的子View绑定数据*@paramholder*@paramposition*/@OverridepublicvoidonBindViewHolder(ViewHolderholder,intposition){//这里是item复用时候,让如果下标与上一次被点击的那个item的下标一致,就显示,否则就隐藏,避免图标错乱if(position==pos){holder.mImageView.setVisibility(View.VISIBLE);//这里必须调用下这个点击方法,否则会出现一个图片可出现2个的bugonClick((View)holder.mImageView.getParent());}else{holder.mImageView.setVisibility(View.GONE);}//以下根据自己需要情况进行设置holder.mTextView.setTextSize(10);holder.mTextView.setText(datas[position]);}/***这里返回item数量*@return*/@OverridepublicintgetItemCount(){returndatas.length;}//这里是初始化位置,设置-1就是说开始不显示,比如想开始显示在position为2的位置,就设置2就行了intpos=-1;/***点击监听*@paramv*/@OverridepublicvoidonClick(Viewv){//每次点击item,都先把之前被点击的item进行初始化(还原)for(inti=0;i<listViewHolder.size();i++){listViewHolder.get(i).mImageView.setVisibility(View.GONE);}//把item的标签取出ViewHolderviewHolder=(ViewHolder)v.getTag();//设置被点击的item显示图标viewHolder.mImageView.setVisibility(View.VISIBLE);//通过viewHolder获取当前item的下标,并赋值给成员变量pos=viewHolder.getAdapterPosition();//清理集合listViewHolder.clear();//添加被点击的item到集合,这是个标识,为了下次点击的时候清理图标用。listViewHolder.add(viewHolder);}/***ViewHolder类,注意要继承RecyclerView.ViewHolder*/publicstaticclassViewHolderextendsRecyclerView.ViewHolder{publicTextViewmTextView;publicImageViewmImageView;publicContextcontext;publicViewHolder(ViewitemView,Contextcontext){super(itemView);mTextView=(TextView)itemView.findViewById(R.id.tv);mImageView=(ImageView)itemView.findViewById(R.id.p_w_picpathView);this.context=context;}}}
运行效果:
上面写了注释,在已知的方法里,我觉得算非常简洁明了了。
有什么意见可以给我留言,互相交流,共同进步!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。