博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecyclerView的基础使用
阅读量:7207 次
发布时间:2019-06-29

本文共 8880 字,大约阅读时间需要 29 分钟。

hot3.png

RecyclerView的基本功能介绍:

     1. 通过setLayoutManager方法可以设置布局,几个子类布局如下:

        -> LinearLayoutManager(ListView形式的布局)

        -> GridLayoutManager(GridView形式的布局)

        -> StaggeredGridLayoutManager(瀑布流形式的布局,其实本质还是GridView,只是每个Item的高度不一样)

    2. 通过addItemDecoration设置Item之间的分割线

    3. 通过setItemAnimator设置添加,删除Item时的动画

本文由于需要展示ListView,Vertical GridView,Horizontal GridView和Staggered(瀑布流),所以就不设置Item之间的分割线,直接在XML中设置Item的间距替代。

主界面的布局(activity_main):

    
        
        
        
        

    Item的布局文件(item_recyclerview):

    

    主界面Activity:

package com.example.testrecyclerview;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Bundle;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.example.testrecyclerview.SimpleAdapter.OnItemClickListener;public class MainActivity extends Activity implements  android.view.View.OnClickListener { private RecyclerView mRecyclerView; private List
 mDatas; private SimpleAdapter mAdapter; private StaggeredAdapter mStaggeredAdapter; private Button mAddBtn; private Button mDeleteBtn; private Button mMenuBtn; private AlertDialog.Builder mBuilder; private DialogInterface.OnClickListener mListener; private int mType = 0; private final int SIMPLE = 0; private final int STAGGERED = 1; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initData();  initView();  addListener();  // 设置布局  mRecyclerView.setLayoutManager(new LinearLayoutManager(this,    LinearLayoutManager.VERTICAL, false));  // 设置动画  mRecyclerView.setItemAnimator(new DefaultItemAnimator()); } protected void initData() {  mDatas = new ArrayList
();  for (int i = 'A'; i < 'z'; i++) {   mDatas.add("" + (char) i);  } } private void initView() {  mAddBtn = (Button) findViewById(R.id.id_add);  mDeleteBtn = (Button) findViewById(R.id.id_delete);  mMenuBtn = (Button) findViewById(R.id.id_menu);  mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);  mAdapter = new SimpleAdapter(this, mDatas);  mStaggeredAdapter = new StaggeredAdapter(this, mDatas);  mRecyclerView.setAdapter(mAdapter);  mListener = new DialogInterface.OnClickListener() {   @Override   public void onClick(DialogInterface dialog, int which) {    switch (which) {    case 0: // ListView     mType = SIMPLE;     mRecyclerView.setAdapter(mAdapter);     mRecyclerView.setLayoutManager(new LinearLayoutManager(       MainActivity.this, LinearLayoutManager.VERTICAL,       false));     break;    case 1: // Vertical GridView     mType = SIMPLE;     mRecyclerView.setAdapter(mAdapter);     mRecyclerView       .setLayoutManager(new StaggeredGridLayoutManager(3,         StaggeredGridLayoutManager.VERTICAL));     break;    case 2: // Horizontal GridView     mType = SIMPLE;     mRecyclerView.setAdapter(mAdapter);     mRecyclerView       .setLayoutManager(new StaggeredGridLayoutManager(5,         StaggeredGridLayoutManager.HORIZONTAL));     break;    case 3: // Staggered     mType = STAGGERED;     mRecyclerView.setAdapter(mStaggeredAdapter);     mRecyclerView       .setLayoutManager(new StaggeredGridLayoutManager(3,         StaggeredGridLayoutManager.VERTICAL));     break;    default:     break;    }   }  };  String[] menu = { "ListView", "Vertical GridView",    "Horizontal GridView", "Staggered" };  mBuilder = new AlertDialog.Builder(this).setTitle("Menu").setItems(    menu, mListener); } private void addListener() {  mAddBtn.setOnClickListener(this);  mDeleteBtn.setOnClickListener(this);  mMenuBtn.setOnClickListener(this);  mAdapter.setOnItemClickListener(new OnItemClickListener() {   @Override   public void onItemLongClick(View view, int position) {    mAdapter.deleteItem(position);    Toast.makeText(MainActivity.this, "long click:" + position,      Toast.LENGTH_SHORT).show();   }   @Override   public void onItemClick(View view, int position) {    Toast.makeText(MainActivity.this, "click:" + position,      Toast.LENGTH_SHORT).show();   }  });    mStaggeredAdapter.setOnItemClickListener(new OnItemClickListener() {   @Override   public void onItemLongClick(View view, int position) {    mStaggeredAdapter.deleteItem(position);    Toast.makeText(MainActivity.this, "long click:" + position,      Toast.LENGTH_SHORT).show();       }   @Override   public void onItemClick(View view, int position) {    Toast.makeText(MainActivity.this, "click:" + position,      Toast.LENGTH_SHORT).show();   }     }); } @Override public void onClick(View v) {  switch (v.getId()) {  case R.id.id_add:   if (mType == SIMPLE) {    mAdapter.addItem(1);   } else {    mStaggeredAdapter.addItem(1);   }   break;  case R.id.id_delete:   if (mType == SIMPLE) {    mAdapter.deleteItem(1);   } else {    mStaggeredAdapter.deleteItem(1);   }   break;  case R.id.id_menu:   mBuilder.show();   break;  default:   break;  } }}

代码中有两个Adapter,分别是SimpleAdapter和StaggeredAdapter,后一个Adapter主要是给瀑布流布局使用,因为其item的高度是随机的。

 


SimpleAdapter继承RecyclerView中的内置Adapter, 并且RecyclerView中强制用户使用ViewHolder,用户需要写一个RecyclerView中的ViewHolder:

package com.example.testrecyclerview;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.ViewHolder;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnLongClickListener;import android.view.ViewGroup;import android.widget.TextView;public class SimpleAdapter extends  RecyclerView.Adapter
 { protected List
 mList; protected Context mContext; protected LayoutInflater mInflater; protected OnItemClickListener mClickListener;  public SimpleAdapter(Context context, List
 list){  this.mContext = context;  this.mInflater = LayoutInflater.from(context);  if (list != null){   this.mList = list;  }else {   mList = new ArrayList
();  }   }  @Override public int getItemCount() {  // TODO Auto-generated method stub  return mList.size(); } @Override public void onBindViewHolder(final SimpleViewHolder holder, final int position) {  holder.mTextView.setText(mList.get(position));    if (mClickListener != null){   holder.itemView.setOnClickListener(new OnClickListener() {    @Override    public void onClick(View v) {     int pos = holder.getPosition();     mClickListener.onItemClick(holder.itemView, pos);         }   });      holder.itemView.setOnLongClickListener(new OnLongClickListener() {        @Override    public boolean onLongClick(View v) {     int pos = holder.getPosition();     mClickListener.onItemLongClick(holder.itemView, pos);     return false;    }   });  } } @Override public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int arg1) {  View view = mInflater.inflate(R.layout.item_recyclerview, parent, false);  SimpleViewHolder holder = new SimpleViewHolder(view);  return holder; }  public void addItem(int position){  mList.add(position, "Insert one");  notifyItemInserted(position); }  public void deleteItem(int position){  mList.remove(position);  notifyItemRemoved(position); }  public void setOnItemClickListener(OnItemClickListener listener){  this.mClickListener = listener; }  class SimpleViewHolder extends ViewHolder{  TextView mTextView;  public SimpleViewHolder(View view) {   super(view);   mTextView = (TextView) view.findViewById(R.id.id_num);  } }  public interface OnItemClickListener{  void onItemClick(View view, int position);  void onItemLongClick(View view, int position); }}

瀑布流的Adapter,继承自SimpleAdapter:

package com.example.testrecyclerview;import java.util.ArrayList;import java.util.List;import com.example.testrecyclerview.SimpleAdapter.SimpleViewHolder;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.ViewHolder;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.view.View.OnLongClickListener;import android.view.ViewGroup.LayoutParams;import android.widget.TextView;public class StaggeredAdapter extends  SimpleAdapter { protected List
 mHeights;  public StaggeredAdapter(Context context, List
 list){  super(context, list);    mHeights = new ArrayList
();  for (int i=0; i

 

需要注意的是,RecyclerView并没有实现点击事件,这需要我们自己写接口并去调用,这一点在Adapter中已经有体现

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2532734/blog/541011

你可能感兴趣的文章
专访刘刚:360手机卫士的性能监控与优化
查看>>
去哪儿网消息队列设计与实现
查看>>
MySQL 5.7中的更多改进,包括计算列
查看>>
书评与访谈:Scrum for Managers
查看>>
借助Unity AR Foundation构建跨平台AR应用
查看>>
《The Coaching Booster》问与答
查看>>
独立云计算服务商的多维实践之道:用户需求驱动变革
查看>>
JavaMail邮件发送不成功的那些坑人情况及分析说明
查看>>
GitHub Checks API帮助应用实现进一步的持续集成
查看>>
庖丁解牛迭代器,聊聊那些藏在幕后的秘密
查看>>
勇敢的交流者在敏捷组织中的重要性
查看>>
Android Pie提供了自适应供电、神经网络API 1.1等新特性
查看>>
蓝云公布2019云生态战略,如何解决企业上云关键问题?
查看>>
FaaS、PaaS和无服务器体系结构的优势
查看>>
Ceylon语言加入Eclipse基金会
查看>>
一文盘点MWC 2019所有5G设备和研发进展
查看>>
【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵
查看>>
网站真分页js代码该怎么写?
查看>>
教你五分钟入门使用html5 svg绘制图形
查看>>
vue-concise-slider vue滑动组件
查看>>