日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RecyclerView多布局的简单使用

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RecyclerView多布局的简单使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

RecyclerView多布局的簡單

?? RecyclerView 是在Android5.0之后推出的,是一個比ListView更加靈活更加高效的適配器類型控件。但是RecyclerView不同于其他類型的適配器,它還需要一個LayoutManager進行頁面控制展示。RecyclerView提供了三種布局管理器:
  1、LinearLayoutManager:線性布局管理器,支持水平和垂直效果。
  2、GridLayoutManager:網(wǎng)格布局管理器,支持水平和垂直效果。
  3、StaggeredGridLayoutManager:分布型管理器,瀑布流效果

RecyclerView的使用:
  1、引入RecyclerView依賴包,V7下的,兼容到API17.
  2、在xml布局中聲明,在Java代碼中初始化。
  3、設置布局管理器
  4、創(chuàng)建適配器,設置數(shù)據(jù)源,綁定適配器
    具體創(chuàng)建適配器:①創(chuàng)建一個類,繼承RecyclerView.Adapter<ViewHolder>.
            ②創(chuàng)建一個類ViewHolder,繼承RecyclerView。VIewHolder,該類需要創(chuàng)建一個匹配父類的構(gòu)造。
            ③重寫適配器中的方法:getItemCount():獲取數(shù)據(jù)源的個數(shù)(item的數(shù)量);onCreateViewHolder():該方法中導入布局,實例化VIewHolder;onBindViewHolder():綁定VIewHolder,加載數(shù)據(jù)。

注意一點:RecyclerView的LinearLayoutManager不同于一般的適配器的布局,RecyclerView的item最外層的布局參數(shù)是有效的,如高度寬度等,所以在使用的時候,第一種方法是在導入View的時候指定沒有parent(不推薦使用),第二種方法是在item布局的最外層指定具體的參數(shù)。
RecyclerView 為開發(fā)者提供了強大的復用機制,但是所有的點擊事件都丟了,沒有提供默認的點擊事件,所以需要我們自己為RecyclerView手動實現(xiàn)點擊。

?

多布局在JSON文件中一般有明確的區(qū)分,例如通過Type=1,2,3,4,等方式進行區(qū)分,Type=1,說明是一種類型的布局!

RecyclerView的使用場景:

多種樣式的列表。

宮格和列表同時存在

分類列表(比如通訊錄)

多布局的重點:

1、???????復寫getItemViewType(int position)

根據(jù)各個position的位置,返回不同的類型。

2、???????處理getItemCount

3、???????按照返回的類型處理onCreateViewHolder和onBindViewHolder方法

RecyclerView多種布局原理和機制::

???? 多種布局保存!

RV中的關(guān)鍵成員:

???? Type <-?? getItemViewType(int position)

???? RecyclerView.Holder

???? RecyclerView.Recycler

Recycler中保存了一些緩存機制(類上與ListView中的conVertView)

多布局的設計流程

滾動 ----àgetItemViewType(position)------à根據(jù)Type尋找Holder-------àif(尋找Holder時返回null)-----àadpter.createViewHolder-----à否則adapter.bindViewHolder.

getItemViewType

???? ItemType保存在Holder中

???? Holder根據(jù)position被緩存在cache中

???? 遍歷緩存中的Holder,如果Type一致就返回。

當我們需要重復使用的時候,系統(tǒng)會在cache里面拿holder,進而實現(xiàn)使用流暢。

和ListView的區(qū)別

1.???type已經(jīng)是Holder的成員

2.???RecyclerView的緩存單位是Holder而不在是View

3.???RecyclerPool的緩存key是type

getItemViewtype(intposition)中的Type,只需要一個數(shù)字,不一定是連續(xù)的數(shù)字。

?

????

???? 代碼實現(xiàn)以及說明:

導入compile 'com.android.support:recyclerview-v7:26.+'

RecyclerView的依賴

DataModle:

?? package com.example.jash.recyclerview_more;import java.io.Serializable; public class DataModel implements Serializable {public static final int TYPE_ONE = 1;public static final int TYPE_TWO = 2;public static final int TYPE_THREE = 3;public int type;public int avatarColor;public String name;public String Content;public int contentColor; } ? 三個布局的XML: First: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="60dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/avatar"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginLeft="20dp" /><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"tools:text="aaaaa" /> </LinearLayout> Two: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="60dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/zuozhe"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginLeft="20dp" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"tools:text="aaaaa" /><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"tools:text="aaaaa" /></LinearLayout> </LinearLayout> Three: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="60dp"><ImageViewandroid:layout_alignParentLeft="true"android:id="@+id/avatar"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerVertical="true" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toRightOf="@+id/avatar"android:orientation="vertical"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"tools:text="aaaaa" /><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"tools:text="aaaaa" /></LinearLayout><ImageViewandroid:id="@+id/contentImage"android:layout_width="60dp"android:layout_height="60dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"/> </RelativeLayout> ??? 抽象ViewHolder import android.support.v7.widget.RecyclerView; import android.view.View; public abstract class TypeAbstrHolder extends RecyclerView.ViewHolder {public TypeAbstrHolder(View itemView) {super(itemView);}public abstract void bindHolder(DataModel model); } 三個ViewHolder 繼承抽象ViewHolder First: import android.graphics.Color; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class TypeOneViewHolder extends TypeAbstrHolder {public ImageView avatar;public TextView name;public TypeOneViewHolder(View itemView) {super(itemView);avatar = (ImageView) itemView.findViewById(R.id.avatar);name = (TextView) itemView.findViewById(R.id.name);itemView.setBackgroundColor(Color.GREEN);}@Overridepublic void bindHolder(DataModel model) {avatar.setBackgroundResource(model.avatarColor);name.setText(model.name);}} Two: import android.content.Context; import android.graphics.Color; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class TypeTwoHolder extends TypeAbstrHolder {private ImageView zuozhe;private TextView name;private TextView content;public TypeTwoHolder(View itemView) {super(itemView);zuozhe = (ImageView) itemView.findViewById(R.id.zuozhe);name = (TextView) itemView.findViewById(R.id.name);content = (TextView) itemView.findViewById(R.id.content);itemView.setBackgroundColor(Color.BLACK);}@Overridepublic void bindHolder(DataModel model) {zuozhe.setBackgroundResource(model.avatarColor);name.setText(model.name);content.setText(model.Content);} } three: import android.graphics.Color; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class TypeThreeViewHolder extends TypeAbstrHolder {private ImageView avatar;private TextView name;private TextView content;private ImageView contentColor;public TypeThreeViewHolder(View itemView) {super(itemView);avatar = (ImageView) itemView.findViewById(R.id.avatar);name = (TextView) itemView.findViewById(R.id.name);content = (TextView) itemView.findViewById(R.id.content);contentColor = (ImageView) itemView.findViewById(R.id.contentImage);itemView.setBackgroundColor(Color.GRAY);}@Overridepublic void bindHolder(DataModel model) {avatar.setImageResource(model.avatarColor);name.setText(model.name);content.setText(model.Content);contentColor.setBackgroundResource(model.contentColor);} } RecyclerView的Adapter import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup;import java.util.ArrayList; import java.util.List; import java.util.concurrent.BrokenBarrierException; public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private List<DataModel> mList = new ArrayList<>();private LayoutInflater inflater;protected MyAdapter(Context context) {this.context = context;inflater = LayoutInflater.from(context);}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {switch (viewType) {case DataModel.TYPE_ONE:return new TypeOneViewHolder(inflater.inflate(R.layout.one, parent, false));case DataModel.TYPE_TWO:return new TypeTwoHolder(inflater.inflate(R.layout.two, parent, false));case DataModel.TYPE_THREE:return new TypeThreeViewHolder(inflater.inflate(R.layout.three, parent, false));}return null;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {((TypeAbstrHolder) holder).bindHolder(mList.get(position));}@Overridepublic int getItemViewType(int position) {return mList.get(position).type;}@Overridepublic int getItemCount() {return mList.size();}public void addList(List<DataModel> list) {mList.addAll(list);} } MainActivity: package com.example.jash.recyclerview_more;import android.graphics.Rect; import android.support.v4.view.GravityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View;import java.util.ArrayList; import java.util.Date; import java.util.List;public class MainActivity extends AppCompatActivity {private RecyclerView mRecycler;private MyAdapter mAdapter;int color[] = {android.R.color.holo_orange_dark,android.R.color.holo_red_dark,android.R.color.holo_blue_bright};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mRecycler = (RecyclerView) findViewById(R.id.recycler); ??????? mRecycler.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));mAdapter = new MyAdapter(this);mRecycler.setAdapter(mAdapter);initData();}private void initData() {List<DataModel> list = new ArrayList<>();for (int i = 0; i < 30; i++) {int type;if (i < 5 || (i > 15 && i < 20)) {type = 1;} else if (i < 10 || i > 26) {type = 2;} else {type = 3;}Log.d("1", "initData: " + String.valueOf(type) + "=====>>>" + i);DataModel data = new DataModel();data.avatarColor = color[type - 1];data.type = type;data.name = "name" + i;data.Content = "conten" + type;data.contentColor = color[type - 1];list.add(data);}mAdapter.addList(list);} } mainXML: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.jash.recyclerview_more.MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recycler"android:layout_width="match_parent"android:layout_height="match_parent" /> </RelativeLayout> 實現(xiàn)的布局! 為列表類的還有三種不同的布局的顯示 ????????? 二、如何實現(xiàn)GridView和ListView同時顯示! ??? MainActivity中:加入代碼 final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);創(chuàng)建一個3列顯示的GridView。 ??????? Log.d("1", "onCreate: " + gridLayoutManager.getSpanCount()); 該方法為合并GridView中的列 gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) { //獲取指定position上的itemView的typeint type = mRecycler.getAdapter().getItemViewType(position); //如果type==類型為3 的布局 if (type == DataModel.TYPE_THREE) { //獲取gridLayoutManager的列數(shù),上面指定為3了,所有將3 合并成1,否則不合并return gridLayoutManager.getSpanCount();} else {return 1;}}}); //添加分隔線!mRecycler.addItemDecoration(new RecyclerView.ItemDecoration() {@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams(); //獲取一行中含有多少個 Viewint spanSize = layoutParams.getSpanSize(); // spanIndex ==1?? 為View的左側(cè) ?==2? 為View的右側(cè)int spanIndex = layoutParams.getSpanIndex();outRect.top = 20;if (spanSize != gridLayoutManager.getSpanCount()) {outRect.left=3; ??????????????? } //切記一定要注釋掉這行代碼! //??????????????? super.getItemOffsets(outRect, view, parent, state); ??????????? }}); ? 效果圖:

?????????????

?

總結(jié)

以上是生活随笔為你收集整理的RecyclerView多布局的简单使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。