RecyclerView封装详解完美用法二

原创 2016年05月30日 16:15:28

这篇主要是recyclerView实现瀑布流:

一、RecyclerView通用ViewHolder同上篇。

二、然后是适配器

package com.example.recyclerview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by 11981 on 2016/5/28.
 * 瀑布流适配器
 */
public abstract class StaggeredAdapter extends RecyclerView.Adapter<MyViewHolder>{
    private List<Integer> mHeights;
    private LayoutInflater mInflater;
    private Context mContext;
    public List<DataDTO> mDatas;
    private int mlayoutId;

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
        void onItemLongClick(View view, int position);
    }

    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.onItemClickListener = listener;
    }

    public StaggeredAdapter(Context context, List<DataDTO> datas,int layoutId) {
        this.mContext = context;
        this.mDatas = datas;
        this.mlayoutId = layoutId;
        mInflater = LayoutInflater.from(context);
        mHeights = new ArrayList<Integer>();
        for (int i = 0; i <mDatas.size() ; i++) {
            mHeights.add((int)(100+Math.random()*300));
        }
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        ViewGroup.LayoutParams lp=holder.itemView.getLayoutParams();
        lp.height =mHeights.get(position);
        holder.itemView.setLayoutParams(lp);
        convert(holder,mDatas.get(position));
        setUpItemEvent(holder);
    }
    public abstract  void convert(MyViewHolder holder,DataDTO datadto);

    public void setUpItemEvent(final MyViewHolder holder) {
        if (onItemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int layoutPosition=holder.getAdapterPosition();
                    onItemClickListener.onItemClick(holder.itemView, layoutPosition);

                }
            });
            //longclick
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int layoutPosition=holder.getAdapterPosition();
                    onItemClickListener.onItemLongClick(holder.itemView,layoutPosition);
                    return false;
                }
            });
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        MyViewHolder viewHolder = new MyViewHolder(mInflater.inflate(mlayoutId, parent, false));
        return viewHolder;
    }

//    public void addData(int pos,DataDTO datas) {
//        mDatas.add(pos, datas);
//        notifyItemInserted(pos);
//    }
//
    public void deleteData(int pos) {
        mDatas.remove(pos);
        notifyItemRemoved(pos);
    }
}
三、最后是主类:

package com.example.recyclerview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

/***
 * 瀑布流主类
 */
public class StaggereGridLayoutActivity extends AppCompatActivity{

    private RecyclerView mRecyclerView;
    private List<DataDTO> mDatas;
    private StaggeredAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.staggere_activity);

        initDatas();
        initViews();
        mAdapter = new StaggeredAdapter(this, mDatas, R.layout.item_single_view) {
            @Override
            public void convert(MyViewHolder holder, DataDTO datadto) {
                holder.setText(R.id.id_tv,datadto.getAaa()).setImageResource(R.id.id_img,datadto.getBbb());
            }
        };
        mRecyclerView.setAdapter(mAdapter);
        //设置recyclerview布局管理器
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

        mAdapter.setOnItemClickListener(new StaggeredAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {

            }

            @Override
            public void onItemLongClick(View view, int position) {
                mAdapter.deleteData(position);
            }
        });

        //设置recycler的Item分割线
        //listview转gridview没有列的分割
       // mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
    }

    private void initDatas() {
        mDatas = new ArrayList<DataDTO>();
        DataDTO data=new DataDTO();
        for (int i = 0; i <20 ; i++) {
            data.setAaa("abcd");
            data.setBbb(R.drawable.ic_menu_delete);
            mDatas.add(data);
        }
//        mDatas = new ArrayList<String>();
//        for (int i = 'A'; i <= 'z'; i++) {
//            mDatas.add("" + (char) i);
//        }
    }

    private void initViews() {
        mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
    }

}
四、RecyclerView依赖工具类:同上

五、实体类:同上

六、其它的代码:同上

最后在清单文件中注册activity:

<activity android:name=".StaggereGridLayoutActivity">

</activity>

完成



RecyclerView封装详解完美用法一

通过对RecyclerView的了解,个人认为此控件适用于需要listview与GridView切换的界面以及瀑布流界面。 第一篇主要是listView与Gridview切换代码: 一、先上Recyc...
  • Emperor_rock
  • Emperor_rock
  • 2016年05月30日 16:06
  • 3143

RecyclerView 教程,全面了解各种使用方法

RecyclerView 在2014年就已经出来了,15年的时候有了解一下,但是项目中一直没用上,最近看到,发现RecyclerView 出现了很多拓展,它的出现就是为了代替ListView、Grid...
  • xx326664162
  • xx326664162
  • 2017年03月13日 18:51
  • 1955

Android 对封装RecyclerView.Adapter讲解

对RecyclerView.Adapter封装 对RecyclerView.ViewHolder封装
  • chenlove1
  • chenlove1
  • 2017年02月14日 21:52
  • 1852

Android RecyclerView 使用完全解析 体验艺术般的控件

Android RecyclerView 使用完全解析 概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 据官方的介绍...
  • lmj623565791
  • lmj623565791
  • 2015年04月16日 09:07
  • 849410

真实项目运用-RecyclerView封装

原文链接:从零开始搭建android框架系列 项目地址:MVPCommon 前言很久没有发表从零开始搭建android框架系列这个系列的文章了 。由于最近工作确实有点忙碌,也在脚踏实地的花时间研...
  • u014315849
  • u014315849
  • 2016年09月14日 14:26
  • 14545

RecyclerView封装——可以直接项目中使用,拿走不谢!

前言 很久没有发表从零开始搭建android框架系列这个系列的文章了 。由于最近工作确实有点忙碌,也在脚踏实地的花时间研究android方面自己很多不懂的东西。但是写博客确实是一个坚持不懈和...
  • hbyh632
  • hbyh632
  • 2017年12月11日 11:56
  • 201

为RecyclerView打造通用Adapter 让RecyclerView更加好用

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47251585; 本文出自:【张鸿洋的博客】 一、概述记得好久以前针...
  • lmj623565791
  • lmj623565791
  • 2016年04月11日 09:17
  • 112446

RecyclerView.Adapter的封装之路

封装后的用法:原始的Adapter单布局的Adapter多布局-单实体的Adapter多布局-多实体的Adapter多布局-多实体-多列的Adapter具体的封装过程:1-SingleAdapter:...
  • Fisher0113
  • Fisher0113
  • 2016年07月19日 15:50
  • 2870

RecyclerView封装--添加下拉刷新和上拉加载更多

1 前言关于RecyclerView 添加上拉加载更多和下拉刷新的封装很多,例如有自定义ViewGroup来实现的,也有使用SwipeRefreshLayout来实现的,我觉得都不是太好,因为对于在项...
  • qiyei2009
  • qiyei2009
  • 2017年06月10日 12:31
  • 806

RecyclerView的基本使用方法

1.RecyclerView的使用方法(使用的Android Studio开发) 首先是recyclerview的配置问题,recyclerview是要导入android.support.v7.wi...
  • Javacainiao931121
  • Javacainiao931121
  • 2016年06月18日 09:26
  • 12749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RecyclerView封装详解完美用法二
举报原因:
原因补充:

(最多只允许输入30个字)