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...

RecyclerView用法详解

使用RecyclerView首先需要导入相应的架包: compile 'com.android.support:recyclerview-v7:24.0.0-alpha2' 主界面: ...

RecyclerView的用法Demo

  • 2017年03月22日 16:37
  • 24.62MB
  • 下载

Android中ScrollView中嵌套RecyclerView的完美解决办法

工作中的项目是Eclipse项目,有用到RecyclerView,也是在ScrollView中使用出现问题的,不过很容易就解决了,最近在As项目中ScrollView嵌套RecyclerView的时候...
  • Ikulm
  • Ikulm
  • 2017年06月14日 00:16
  • 274

Android RecyclerView用法 视频列表 两列

  • 2017年07月03日 15:48
  • 26.85MB
  • 下载

RecyclerView用法示例

  • 2016年05月12日 17:38
  • 6.39MB
  • 下载

RecyclerView Divider完美解决方案

关于RecyclerView的使用,不是本文介绍的重点,还不清楚的同学可以参考这篇文章: Android RecyclerView 使用完全解析 体验艺术般的控件。RecyclerView替代List...

隐藏Listview和RecyclerView 滑动边界的阴影,去除滚动条加分隔线等等等,让你的布局完美起来~

1、Listview的属性设置,虽然现在用RecyclerView的特多了,很少用Listview了,但是还得说说,假如哪天你看看你曾经的项目,还看到你曾经写的PullToRefreshListVie...
  • kl0715
  • kl0715
  • 2017年02月14日 13:08
  • 3002

RecyclerView与SwipeRefreshLayout的完美搭配

SwipeRefreshLayout 是谷歌公司推出的用于下拉刷新的控件,在Version 19.1之后SwipeRefreshLayout 被放到support v4中。我们在前面也已经说过一个Sw...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RecyclerView封装详解完美用法二
举报原因:
原因补充:

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