网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月23日漏签0天
android开发吧 关注:225,965贴子:948,921
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 23回复贴,共2页
  • ,跳到 页  
<<返回android开发吧
>0< 加载中...

RecyclerView+SwipeRefreshLayout实现三种布局上拉加载下拉刷新

  • 只看楼主
  • 收藏

  • 回复
  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一楼留给大神,致敬。。。


2025-06-23 17:02:11
广告
  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先介绍一下RecyclerView,这个控件我一年之前就听说过了,但一直没去用过,还是跟之前一样,listview,gridview那样去用,直到最近才去真真的了解了一下这个谷歌所谓的不比ListView复杂,反而更灵活好用,它将数据、排列方式、数据的展示方式都分割开来,因此可定制型,自定义的形式也非常多,非常灵活的组件


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第一步 androidStudio 导入RecyclerView
导入之后大家就可以直接用了


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
要写 那肯定是先要搞清楚怎么去定义这个组件总不能想咱们写listview一样,直接写,那肯定不行的,像这样就可以了,同时我上面也定义了一层swipeRefresgLayout,是用来添加下拉刷新的


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好了 布局定义好之后我们就是寻找组件了,这时候就有了一个关键的东西LayoutManager,这个东西就是关系到你是想让列表listview展示还是gridview展示,或者是瀑布流StaggeredGridLayout展示了,先来看listview展示


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
public class MainActivity extends Activity {
private RecyclerView recyclerView;//一个可以替代listview gridview的控件
private RecyclerView.LayoutManager layoutManager;//必须实例化layoutManager 使用它来区分是瀑布流还是listview还是gridview
private RecyclerviewAdapter adapter; //适配器也会发生改变具体请看适配器内容
private List<String>list;
private ItemTouchHelper mItemTouchHelper;
private LinearLayoutManager linearLayoutManager;
//是否正在上拉数据
private boolean loading = false;
private SwipeRefreshLayout refreshLayout;//谷歌官方提供的刷新控件下面已做具体注释
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
refreshLayout= (SwipeRefreshLayout) findViewById(R.id.refresh_layout);
recyclerView= (RecyclerView) findViewById(R.id.recyclerview_view);
recyclerView.setHasFixedSize(true);
//关联ItemTouchHelper和RecyclerView
linearLayoutManager = new LinearLayoutManager(MainActivity.this);
layoutManager=linearLayoutManager;
recyclerView.setLayoutManager(layoutManager);
//给recyclerview设置分割线
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
}
private void initData(){
list=new ArrayList<>();
for(int i=1;i<=20;i++){
list.add(""+i);
}
//refreshLayout.setColorScheme();//这个方法设置进度条颜色已经弃用
refreshLayout.setColorSchemeResources(R.color.red);//使用新方法来设置它的进度条颜色,最多可设置四种颜色
// refreshLayout.setRefreshing(true);//设置是否隐藏刷新动作 true表示显示,false表示隐藏,默认为true
adapter=new RecyclerviewAdapter(list,MainActivity.this);
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
adapter.addll(list);
refreshLayout.setRefreshing(false);//设置收起刷新状态
//这里等同于网络数据加载
}
},3000);
}
});
ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter);
mItemTouchHelper = new ItemTouchHelper(callback);
mItemTouchHelper.attachToRecyclerView(recyclerView);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastVisibleItemPosition =linearLayoutManager.findLastVisibleItemPosition();
if (lastVisibleItemPosition + 1 == adapter.getItemCount()) {
Log.d("test", "loading executed");
boolean isRefreshing = refreshLayout.isRefreshing();
if (isRefreshing) {
adapter.notifyItemRemoved(adapter.getItemCount());
return;
}
if (!loading) {
loading = true;
setFooterView(recyclerView);
handler.postDelayed(new Runnable() {
@Override
public void run() {
adapter.addll(list);
//这里等同于网络操作
Log.d("test", "load more completed");
loading = false;
}
}, 3000);
}
}
}
});
recyclerView.setAdapter(adapter);
setHeader(recyclerView);
}
private void setHeader(RecyclerView view) {
View header = LayoutInflater.from(this).inflate(R.layout.layout_header, view, false);
adapter.setHeaderView(header);
}
private void setFooterView(RecyclerView view) {
View header = LayoutInflater.from(this).inflate(R.layout.layout_foot, view, false);
adapter.setFooterView(header);
}
}


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上面是设置成listview样式的RecyclerView并且增加了头部和底部视图,和上拉加载


2025-06-23 16:56:11
广告
  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在是时候看一波适配器代码了,我让listviewg和gridview用一个适配器,然后把瀑布流单独了一个适配器


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
package com.aykj.recyclerviewdemo;
import android.content.Context;
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.Collections;
import java.util.List;
/**
* 这个就是适配器的代码了.
*/
public class RecyclerviewAdapter extends RecyclerView.Adapter<RecyclerviewAdapter.MyViewHodler> implements onMoveAndSwipedListener{
private LayoutInflater inflater;
private List<String> list;
private Context context;
private View mHeaderView;
// 底部控件
private View mFooterView;
private boolean isHasHeader = false;
private boolean isHasFooter = false;
private int header=1;
private int foot=1;
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
public static final int TYPE_FOOTER = 2;
public RecyclerviewAdapter(List<String> list, Context context) {
this.context = context;
this.list = list;
inflater = LayoutInflater.from(context);
}
@Override
public MyViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
//listview中的 getView方法 用于view的复用
View view = inflater.inflate(R.layout.activity_listview, parent, false);
MyViewHodler holder = new MyViewHodler(view);
if (viewType == TYPE_FOOTER) {
// 如果是底部类型,返回底部视图
return new MyViewHodler(mFooterView);
}
if (viewType == TYPE_HEADER) {
return new MyViewHodler(mHeaderView);
}
return holder;
}
@Override
public void onBindViewHolder(MyViewHodler holder, int position) {
//相当于listview适配器中的getitem()方法;
if (isHasHeader && isHasFooter) {
// 有头布局和底部时,向前便宜一个,且最后一个不能绑定数据
if (position == 0 || position == list.size() + 1) {
return;
}
final int pos = getRealPosition(holder);
String data =list.get(pos);
if (holder instanceof MyViewHodler) {
holder.textView.setText(data);
}
}
}
public int getRealPosition(RecyclerView.ViewHolder holder) {
if (isHasHeader = true) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
if (isHasFooter = true) {
int position = holder.getLayoutPosition();
return mFooterView == null ? position : position + 1;
}
return 0;
}
public void addll(List<String> data){
this.list.addAll(data);
notifyDataSetChanged();
}
protected boolean isHeadher(int position){
return header!=0 && position < header;
}
protected boolean isFooter(int position){
return foot!=0 && position >=getItemCount()-1;
}
@Override
public int getItemCount() {
int size = list.size();
if (isHasFooter)
size++;
if (isHasHeader)
size++;
return size;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
isHasHeader = true;
notifyItemInserted(0);
}
/**
* 添加底部视图
*
* @param footer
*/
public void setFooterView(View footer) {
mFooterView = footer;
isHasFooter = true;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if(isHasHeader&&position==0){
return TYPE_HEADER;
}
if(isHasFooter&&isHasHeader&&position==list.size()+1){
return TYPE_FOOTER;
}
return TYPE_NORMAL;
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
if(fromPosition<=list.size()){
//交换mItems数据的位置
Collections.swap(list,fromPosition-1,toPosition-1);
//交换RecyclerView列表中item的位置
notifyItemMoved(fromPosition,toPosition);
}
return true;
}
@Override
public void onItemDismiss(int position) {
if(position<=list.size()) {
//删除mItems数据
list.remove(position - 1);
//删除RecyclerView列表对应item
notifyItemRemoved(position);
}
}
public class MyViewHodler extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView;
public MyViewHodler(View itemView) {
super(itemView);
textView= (TextView) itemView.findViewById(R.id.text_recyclerlistview);
imageView= (ImageView) itemView.findViewById(R.id.recyclerview_imag);
}
}
}


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个样子 listview和gridview的样式的列表已经完成了,有头部有底部,有上拉加载,有下拉刷新


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在看一下瀑布流样式的列表,当时在写这个的时候碰到一个问题,就是在滑动的过程中itme会移动甚至会出现自己换位置,很多人可能会写这个瀑布流的时候会使用瀑布流中自己适应itme的高度等等,我是写了两套布局,让item用两套不同的布局展现,你甚至可以再多写点,展示层次不同的瀑布流样式


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
package com.aykj.recyclerviewdemo;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Collections;
import java.util.List;
/**
*这个是瀑布流形式的适配器
*/
public class StaggergridAdapter extends RecyclerView.Adapter<StaggergridAdapter.MyViewHodler> implements onMoveAndSwipedListener{
private LayoutInflater inflater;
private List<String> list;
private Context context;
private View mHeaderView;
private View viewTypeLayout;
// 底部控件
private View mFooterView;
private boolean isHasHeader = false;
private boolean isHasFooter = false;
public static final int TYPE_HEADER = 0;
public static final int TYPE_FOOTER = 1;
public static final int TYPE_LEFT = 2;
public static final int TYPE_RIGHT= 3;
public StaggergridAdapter(List<String> list, Context context) {
this.context = context;
this.list = list;
inflater = LayoutInflater.from(context);
}
@Override
public StaggergridAdapter.MyViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
//listview中的 getView方法 用于view的复用
viewTypeLayout = inflater.inflate(R.layout.activity_listview, parent, false);
StaggergridAdapter.MyViewHodler holder = new StaggergridAdapter.MyViewHodler(viewTypeLayout);
if (viewType == TYPE_FOOTER) {
// 如果是底部类型,返回底部视图
StaggeredGridLayoutManager.LayoutParams clp = (StaggeredGridLayoutManager.LayoutParams) mFooterView.getLayoutParams();
clp.setFullSpan(true);
return new StaggergridAdapter.MyViewHodler(mFooterView);
}
if (viewType == TYPE_HEADER) {
//头部视图
StaggeredGridLayoutManager.LayoutParams clp = (StaggeredGridLayoutManager.LayoutParams) mHeaderView.getLayoutParams();
clp.setFullSpan(true);
return new StaggergridAdapter.MyViewHodler(mHeaderView);
}if(viewType==TYPE_LEFT){
viewTypeLayout=inflater.inflate(R.layout.activity_layoutgrid,parent,false);
return new StaggergridAdapter.MyViewHodler(viewTypeLayout);
}if(viewType==TYPE_RIGHT){
viewTypeLayout=inflater.inflate(R.layout.activity_listview,parent,false);
return new StaggergridAdapter.MyViewHodler(viewTypeLayout);
}
return holder;
}
@Override
public void onBindViewHolder(MyViewHodler holder, int position) {
//相当于listview适配器中的getitem()方法;
if (isHasHeader && isHasFooter) {
// 有头布局和底部时,向前便宜一个,且最后一个不能绑定数据
if (position == 0 || position == list.size() + 1) {
return;
}
int pos = getRealPosition(holder);
String data =list.get(pos);
if (holder instanceof MyViewHodler) {
holder.textView.setText(data);
}
}
}
public int getRealPosition(RecyclerView.ViewHolder holder) {
if (isHasHeader = true) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
if (isHasFooter = true) {
int position = holder.getLayoutPosition();
return mFooterView == null ? position : position + 1;
}
return 0;
}
public void addll(List<String> data){
this.list.addAll(data);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
int size = list.size();
if (isHasFooter)
size++;
if (isHasHeader)
size++;
return size;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
isHasHeader = true;
notifyItemInserted(0);
}
/**
* 添加底部视图
*
* @param footer
*/
public void setFooterView(View footer) {
mFooterView = footer;
isHasFooter = true;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if(isHasHeader&&position==0){
return TYPE_HEADER;
}
if(isHasFooter&&isHasHeader&&position==list.size()+1){
return TYPE_FOOTER;
}if(position%2==0){
//position取余,就是让itme使用不同的布局
return TYPE_LEFT;
}else {
return TYPE_RIGHT;
}
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
if(fromPosition<=list.size()){
//交换mItems数据的位置
Collections.swap(list,fromPosition-1,toPosition-1);
//交换RecyclerView列表中item的位置
notifyItemMoved(fromPosition,toPosition);
}
return true;
}
@Override
public void onItemDismiss(int position) {
if(position<=list.size()) {
//删除mItems数据
list.remove(position - 1);
//删除RecyclerView列表对应item
notifyItemRemoved(position);
}
}
public class MyViewHodler extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView;
public MyViewHodler(View itemView) {
super(itemView);
textView= (TextView) itemView.findViewById(R.id.text_recyclerlistview);
imageView= (ImageView) itemView.findViewById(R.id.recyclerview_imag);
}
}
}


  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
三种样式的recyclerview已经全部实现了,是带有头部底部和上拉加载,下拉刷新的功能,不知道有没有人看到我里面实现了一个onMoveAndSwipedListener接口,这个是一个自定义接口里面有两个方法,是用来实现itme的拖拽和删除功能的,这个也是使用提供好的一个工具类ItemTouchHelper.Callback,直接继承就行
package com.aykj.recyclerviewdemo;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
/**
* Created by Administrator on 2017/2/16.
*/
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
private onMoveAndSwipedListener moveAndSwipedListener;
public SimpleItemTouchHelperCallback(onMoveAndSwipedListener Listener){
moveAndSwipedListener=Listener;
}
/**这个方法是用来设置我们拖动的方向以及侧滑的方向的*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (viewHolder.getItemViewType()==RecyclerviewAdapter.TYPE_HEADER||viewHolder.getItemViewType()==RecyclerviewAdapter.TYPE_FOOTER){
//头部和底部视图不允许拖动
return viewHolder.getAdapterPosition();
}
//如果是ListView样式的RecyclerView
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager){
//设置拖拽方向为上下
final int dragFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
//设置侧滑方向为从左到右和从右到左都可以
final int swipeFlags = ItemTouchHelper.START|ItemTouchHelper.END;
//将方向参数设置进去
return makeMovementFlags(dragFlags,swipeFlags);
}else{//如果是GridView样式的RecyclerView
//设置拖拽方向为上下左右
final int dragFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN|
ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
//不支持侧滑
final int swipeFlags = 0;
return makeMovementFlags(dragFlags,swipeFlags);
}
}
/**当我们拖动item时会回调此方法*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//如果两个item不是一个类型的,我们让他不可以拖拽
if (viewHolder.getItemViewType() != target.getItemViewType()){
//头部和底部视图不允许拖动
return false;
}
moveAndSwipedListener.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}
/**当我们侧滑item时会回调此方法*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//回调adapter中的onItemDismiss方法
moveAndSwipedListener.onItemDismiss(viewHolder.getAdapterPosition());
}
}


2025-06-23 16:50:11
广告
  • 小笨蛋20121109
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
基本上就算完成了,Reclerview+SwipeRefreshLayout+头部底部+itme侧滑删除+长按互换位置等这几个功能大家有兴趣的可以试试


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 23回复贴,共2页
  • ,跳到 页  
<<返回android开发吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示