RecycleView的正确打开方式
Android界面的豐富多彩都是由于ListView的默默付出,但是需求日益變化,ListView的已經不再好用,并且不再滿足“用戶日益增長的娛樂需要同落后界面的矛盾”,于是乎Google 開發出來了RecycleView來滿足用戶各種苛刻需求------說人話。。。
為什么要學RecycleView呢,說來話長,大概是是由于android面試的時候吹牛逼被打臉了...很疼,然后學吧爭取不再被打臉,最少不是那么痛 \(0◇0)/。
一、做一個小demo練習一下類似于ListView的簡單效果
準備:10張小圖片作為素材(地址:https://pan.baidu.com/s/1dHhdN81)
打開AndroidStudio開始吧
首先,創建一個Bean類
package com.example.hxd.gittest;public class WangZhe{private String name;private int imageId;public Fruit(String name, int imageId) {this.name = name;this.imageId = imageId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getImageId() {return imageId;}public void setImageId(int imageId) {this.imageId = imageId;} }這個類沒有什么好說的。
然后創建一個item用來顯示每個recycleView的條目
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/iv_name"android:layout_width="80dp"android:layout_height="80dp"android:layout_marginLeft="20dp"android:layout_marginTop="5dp"android:scaleType="fitXY"android:src="@mipmap/ic_launcher" /><TextViewandroid:id="@+id/tv_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"android:text="小機器人" /> </LinearLayout>顯示效果為:
item顯示效果
之后,創建RecycleView所在的Activity的布局
<?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.hxd.gittest.MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_test"android:layout_width="match_parent"android:layout_height="match_parent" /> </RelativeLayout>重頭戲,書寫適配器Adapter
package com.example.hxd.gittest;import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView;import java.util.List;//1、創建一個Adapter繼承自RecyclerView.Adapter,并且泛型為創建的Adapter的ViewHolder public classWangZheAdapter extends RecyclerView.Adapter<WangZheAdapter.ViewHolder> {//2、創建適配器數據源private List<WangZhe> wangZheList ;//3、構造方法傳入數據public WangZheAdapter(List<WangZhe> wangZhes) {wangZheList = wangZhes;}//4、創建內部類ViewHolder繼承自ecyclerView.ViewHolder//初始化item內部控件public class ViewHolder extends RecyclerView.ViewHolder {ImageView ivWZ;TextView tvWZ;public ViewHolder(View itemView) {super(itemView);ivWZ = itemView.findViewById(R.id.iv_name);tvWZ = itemView.findViewById(R.id.tv_img);}}//5、重寫onCreateViewHolder()方法加載item內部布局,并且返回ViewHolder@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);ViewHolder viewHolder = new ViewHolder(view);return viewHolder;}//6、重寫onBindViewHolder()方法將控件和數據進行適配@Overridepublic void onBindViewHolder(WangZheAdaoter.ViewHolder holder, int position) {wangZhefruit = wangZhList.get(position);holder.ivWZ.setImageResource(wangZhe.getImageId());holder.tvWZ.setText(wangZhe.getName());}//7、重寫getItemCount()方法返回數據源的大小@Overridepublic int getItemCount() {return wangZheList.size();} }創建Adapter一共6步:
①、創建Adapter繼承自RecycleView的adapter,并且泛型為創建Adapter的ViewHolder;
②、創建數據源,并且創建含參構造方方法用于向Adapter內部傳入數據;
③、創建內部類AdapterViewHolder繼承自RecycleView的ViewHolder,并且在內部初始化item數據;
④、重寫onCreateViewHolwer(ViewGroup parent,int viewType)方法進行加載布局;
⑤、重寫onBindViewHolder(WangZheAdaoter.ViewHolder holder, int position)方法進行數據的適配;
⑥、重寫getItemCount方法,返回數據源大小;
好了Adapter就這么簡單的創建完成了
最后,在Activity內來實現效果
是不是很簡單,來看一下效果
簡單Demo效果二、實現橫向滑動
首先,更改一下item布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_name"android:layout_width="80dp"android:layout_height="80dp"android:layout_marginHorizontal="10dp"android:layout_marginTop="5dp"android:scaleType="fitXY"android:src="@mipmap/ic_launcher" /><TextViewandroid:id="@+id/tv_img"android:layout_width="80dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginHorizontal="10dp"android:gravity="center"android:text="小機器人" /> </LinearLayout> 橫向滑動布局item然后,微調MainActivity內部代碼
package com.example.hxd.gittest;import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView;import java.util.ArrayList; import java.util.List;public class MainActivity extends BaseActivity {private List<WangZhe> wangZhes= new ArrayList<>();private RecyclerView rvWZ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initWangZhe();rvWZ= findViewById(R.id.rv_test);//創建layout管理器LinearLayoutManager lm = new LinearLayoutManager(this);//實現橫向滑動的代碼控制,默認縱向滑動lm.setOrientation(LinearLayout.HORIZONTAL);//將管理器設置給RecycleViewrvWZ.setLayoutManager(lm);WangZheAdapter adapter = new WangZheAdapter (wangZhes);rvWZ.setAdapter(adapter);}private void initWangZhe() {for (int i = 0; i < 2; i++) {WangZhe bianqu = new WangZhe ("扁鵲", R.mipmap.bianque);wangZhes.add(bianqu);WangZhe daji = new WangZhe ("妲己", R.mipmap.daji);wangZhes.add(daji);WangZhe diaochan = new WangZhe ("貂蟬", R.mipmap.diaochan);wangZhes.add(diaochan);WangZhe huamulan = new WangZhe ("花木蘭", R.mipmap.huamulan);wangZhes.add(huamulan);WangZhe libai = new WangZhe ("李白", R.mipmap.libai);wangZhes.add(libai);WangZhe liubei = new WangZhe ("劉備", R.mipmap.liubei);wangZhes.add(liubei);WangZhe sunbin = new WangZhe ("扁鵲", R.mipmap.sunbin);wangZhes.add(sunbin);WangZhe sunshangxiang = new WangZhe ("孫尚香", R.mipmap.sunshangxiang);wangZhes.add(sunshangxiang);WangZhe yuji = new WangZhe ("虞姬", R.mipmap.yuji);wangZhes.add(yuji);WangZhe zhuangzhou = new WangZhe ("莊周", R.mipmap.zhuangzhou);wangZhes.add(zhuangzhou);}} }細心的你會發現只是增加了lm.setOrientation(LinearLayout.HORIZONTAL);代碼,簡單吧。
三、實現炫酷瀑布流效果
首先,將item布局改成如下樣式
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_name"android:layout_width="80dp"android:layout_height="80dp"android:layout_marginHorizontal="10dp"android:layout_marginTop="5dp"android:scaleType="fitXY"android:src="@mipmap/ic_launcher" /><TextViewandroid:id="@+id/tv_img"android:layout_width="80dp"android:layout_height="wrap_content"android:layout_gravity="left"android:layout_marginHorizontal="10dp"android:gravity="center"android:text="小機器人" /> </LinearLayout> item效果然后修Activity內部代碼
package com.example.hxd.gittest;import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView;import java.util.ArrayList; import java.util.List;public class MainActivity extends BaseActivity {private List<WangZhe> wangZhes= new ArrayList<>();private RecyclerView rvWZ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initWangZhe();rvWZ= findViewById(R.id.rv_test);//瀑布流管理器StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);rvFruit.setLayoutManager(sglm);//將管理器設置給RecycleViewrvWZ.setLayoutManager(lm);WangZheAdapter adapter = new WangZheAdapter (wangZhes);rvWZ.setAdapter(adapter);}private void initWangZhe() {for (int i = 0; i < 2; i++) {WangZhe bianqu = new WangZhe (getRandomName("扁鵲"), R.mipmap.bianque);wangZhes.add(bianqu);WangZhe daji = new WangZhe (getRandomName("妲己"), R.mipmap.daji);wangZhes.add(daji);WangZhe diaochan = new WangZhe (getRandomName("貂蟬"), R.mipmap.diaochan);wangZhes.add(diaochan);WangZhe huamulan = new WangZhe (getRandomName("花木蘭"), R.mipmap.huamulan);wangZhes.add(huamulan);WangZhe libai = new WangZhe (getRandomName("李白"), R.mipmap.libai);wangZhes.add(libai);WangZhe liubei = new WangZhe (getRandomName("劉備"), R.mipmap.liubei);wangZhes.add(liubei);WangZhe sunbin = new WangZhe getRandomName("孫臏"), R.mipmap.sunbin);wangZhes.add(sunbin);WangZhe sunshangxiang = new WangZhe (getRandomName("孫尚香"), R.mipmap.sunshangxiang);wangZhes.add(sunshangxiang);WangZhe yuji = new WangZhe (getRandomName("虞姬"), R.mipmap.yuji);wangZhes.add(yuji);WangZhe zhuangzhou = new WangZhe (getRandomName("莊周"), R.mipmap.zhuangzhou);wangZhes.add(zhuangzhou);}}//隨機產生圖片下標注內容private String getRandomName(String name) {Random random = new Random();int length = random.nextInt(20) + 1;StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {sb.append(name);}return sb.toString();} }是不是很簡單,來看一下實現效果吧
瀑布流實現效果當然也可以實現橫向瀑布流和多列瀑布流只需要改變一行代碼內部參數即可:StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);這行代碼第一個參數控制列數(行數),如果橫向瀑布流只需要將第二個參數改為HORIZONTAL即可。是不是很簡單
四、RecycleView的點擊事件
設計好了列表不能點擊也是廢物,所以嘛,老老實實實現RecycleView的點擊事件吧,但是RecycleView并沒有像ListView的一樣的setOnItemClickListener點擊事件,只能在adapter內部對每一項進行逐一設置點擊事件,下面我們開始吧
package com.example.hxd.gittest;import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView;import java.util.List;public classWangZheAdapter extends RecyclerView.Adapter<WangZheAdapter.ViewHolder> {private List<WangZhe> wangZheList ;public WangZheAdapter(List<WangZhe> wangZhes) {wangZheList = wangZhes;}public class ViewHolder extends RecyclerView.ViewHolder {ImageView ivWZ;TextView tvWZ;View view;public ViewHolder(View itemView) {super(itemView);view=itemView;ivWZ = itemView.findViewById(R.id.iv_name);tvWZ = itemView.findViewById(R.id.tv_img);}}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);ViewHolder viewHolder = new ViewHolder(view);viewHolder.tvWZ.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int position = viewHolder.getAdapterPosition();WangZhe wangZhe= wangZheList .get(position);Toast.makeText(parent.getContext(), wangZhe.getName(), Toast.LENGTH_LONG).show();}});viewHolder.ivWZ.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int position = viewHolder.getAdapterPosition();WangZhe wangZhe= wangZheList .get(position);Toast.makeText(parent.getContext(), wangZhe.getName(), Toast.LENGTH_LONG).show();}});return viewHolder;}@Overridepublic void onBindViewHolder(WangZheAdaoter.ViewHolder holder, int position) {wangZhefruit = wangZhList.get(position);holder.ivWZ.setImageResource(wangZhe.getImageId());holder.tvWZ.setText(wangZhe.getName());}@Overridepublic int getItemCount() {return wangZheList.size();} }總結
以上是生活随笔為你收集整理的RecycleView的正确打开方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 决策树 math库 c45
- 下一篇: APP不显示GPU过度渲染的问题