RecycleView的使用小结

来源:互联网 发布:sql 父子级联查询 编辑:程序博客网 时间:2024/06/03 21:44

RecycleView的使用

首先导包,需要v7包,若不能成功导入

compile 'com.android.support:design:26+'
包,若还是不可以则查看sdk 是否有support library

然后需要根据需要设置不同的布局管理器显示不同的样式

可以设置分割线,分割线可以进行自定义

可以设置添加删除的动画

适配器的定义:在其中可以自定义添加头部和尾部

监听的实现:需要我们自己实现,可以定义一个监听回调接口,在适配器中设置单项监听,调用回调接口


主布局:

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.administrator.recycleviewtest.MainActivity">    <!--<android.support.v4.widget.SwipeRefreshLayout        android:id="@+id/grid_swipe_refresh"        android:layout_width="match_parent"        android:layout_height="match_parent"        app:layout_behavior="@string/appbar_scrolling_view_behavior">-->    <!--本文主角-->    <android.support.v7.widget.RecyclerView        android:id="@+id/grid_recycler"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <!--</android.support.v4.widget.SwipeRefreshLayout>--></android.support.constraint.ConstraintLayout>
 

单项布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="100dp"    android:layout_height="100dp"    android:gravity="center"    android:orientation="vertical">    <TextView        android:id="@+id/tv_item"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <CheckBox        android:id="@+id/ckbox_xuanze"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"        android:gravity="center" /></LinearLayout>

headerView

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <ImageView        android:id="@+id/imageView"        android:layout_width="match_parent"        android:layout_height="match_parent"        app:srcCompat="@mipmap/ic_launcher" /></LinearLayout>


MainActivity

package com.example.administrator.recycleviewtest;import android.content.DialogInterface;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;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.OrientationHelper;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.MotionEvent;import android.view.View;import android.widget.Toast;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Objects;public class MainActivity extends AppCompatActivity {    //    private SwipeRefreshLayout grid_swipe_refresh;    private RecyclerView grid_recycler;    private List<Map<String, Object>> mDatas;    MyRecyclerAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//        grid_swipe_refresh = (SwipeRefreshLayout) findViewById(R.id.grid_swipe_refresh);        grid_recycler = (RecyclerView) findViewById(R.id.grid_recycler);//        LinearLayoutManager layoutManager = new LinearLayoutManager(this);//        layoutManager.setOrientation(OrientationHelper.VERTICAL);//竖直的线性布局//        LinearLayoutManager layoutManager = new LinearLayoutManager(this);//        layoutManager.setOrientation(OrientationHelper.HORIZONTAL);//水平的线性布局//        GridLayoutManager layoutManager = new GridLayoutManager(this, 3);//gridview的样式,每行3列        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);        //设置布局管理器        grid_recycler.setLayoutManager(layoutManager);        //设置分隔线        grid_recycler.addItemDecoration(new DividerGridItemDecoration(this));        //设置增加或删除条目的动画        grid_recycler.setItemAnimator(new DefaultItemAnimator());        initData();        adapter = new MyRecyclerAdapter(this, mDatas, new MyRecyclerAdapter.ClickListener() {            @Override            public void clickItemListerner(final int position) {                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);                builder.setNegativeButton("删除", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        mDatas.remove(position);                        adapter.notifyItemRemoved(position);//删除某项刷新适配器                        adapter.notifyItemRangeChanged(position, mDatas.size());//刷新                    }                });                builder.setNeutralButton("选择", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        mDatas.get(position).put("checkbox", true);                        adapter.notifyDataSetChanged();                    }                });                builder.setPositiveButton("添加", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        Map<String, Object> map = new HashMap<String, Object>();                        map.put("name", "添加");                        map.put("checkbox", true);                        mDatas.add(position, map);                        adapter.notifyItemInserted(position);                        adapter.notifyItemRangeChanged(position, mDatas.size());                    }                });                builder.create().show();            }            @Override            public void longClickItemListener(int position) {            }        });        View headerview = getLayoutInflater().inflate(R.layout.headerview, null);        headerview.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Toast.makeText(MainActivity.this, "点击", Toast.LENGTH_SHORT).show();            }        });        adapter.setHeaderView(headerview);        grid_recycler.setAdapter(adapter);    }    private void initData() {        mDatas = new ArrayList<Map<String, Object>>();        for (int i = 0; i < 100; i++) {            Map<String, Object> map = new HashMap<>();            map.put("name", "姓名      " + i);            map.put("checkbox", false);            mDatas.add(map);        }    }}

Adapter

package com.example.administrator.recycleviewtest;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.CheckBox;import android.widget.CompoundButton;import android.widget.TextView;import java.util.List;import java.util.Map;/** * Created by Administrator on 2017/7/14. */public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {    private List<Map<String, Object>> mDatas;    private Context mContext;    private LayoutInflater inflater;    private ClickListener clickListener;    public static final int TYPE_HEADER = 0;    public static final int TYPE_NORMAL = 1;    private View mHeaderView;    public MyRecyclerAdapter(Context context, List<Map<String, Object>> datas, ClickListener clickListener) {        this.mContext = context;        this.mDatas = datas;        inflater = LayoutInflater.from(mContext);        this.clickListener = clickListener;    }    public void setHeaderView(View headerView) {        mHeaderView = headerView;        notifyItemInserted(0);    }    public View getHeaderView() {        return mHeaderView;    }    public int getRealPosition(RecyclerView.ViewHolder holder) {        int position = holder.getLayoutPosition();        return mHeaderView == null ? position : position - 1;    }    @Override    public int getItemViewType(int position) {        if (mHeaderView == null) return TYPE_NORMAL;        if (position == 0) return TYPE_HEADER;        return TYPE_NORMAL;    }    @Override    public MyRecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if(mHeaderView != null && viewType == TYPE_HEADER) return new MyViewHolder(mHeaderView);        View view = inflater.inflate(R.layout.item_home, parent, false);        MyViewHolder holder = new MyViewHolder(view);        return holder;    }    @Override    public void onBindViewHolder(MyRecyclerAdapter.MyViewHolder holder, final int position) {        if(getItemViewType(position) == TYPE_HEADER) return;        holder.tv.setText(mDatas.get(position).get("name").toString());        holder.ckbox_xuanze.setOnCheckedChangeListener(null);        holder.ckbox_xuanze.setChecked((boolean) mDatas.get(position).get("checkbox"));        holder.ckbox_xuanze.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {            @Override            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {                mDatas.get(position).put("checkbox", b);            }        });        holder.view.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                clickListener.clickItemListerner(position);            }        });        holder.view.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View view) {                clickListener.longClickItemListener(position);                return true;            }        });    }    @Override    public int getItemCount() {        return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;    }    class MyViewHolder extends RecyclerView.ViewHolder {        TextView tv;        CheckBox ckbox_xuanze;        View view;        public MyViewHolder(View view) {            super(view);            tv = (TextView) view.findViewById(R.id.tv_item);            ckbox_xuanze = view.findViewById(R.id.ckbox_xuanze);            this.view = view;        }    }    interface ClickListener {        void clickItemListerner(int position);        void longClickItemListener(int position);    }}

自定义分割线

package com.example.administrator.recycleviewtest;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;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;/** * Created by Administrator on 2017/7/14. */public class DividerGridItemDecoration extends RecyclerView.ItemDecoration{    private static final int[] ATTRS = new int[] { android.R.attr.listDivider };    private Drawable mDivider;    public DividerGridItemDecoration(Context context)    {        final TypedArray a = context.obtainStyledAttributes(ATTRS );        mDivider = a.getDrawable(0);        a.recycle();    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)    {        drawHorizontal(c, parent);        drawVertical(c, parent);    }    private int getSpanCount(RecyclerView parent)    {        // 列数        int spanCount = -1;        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();        if (layoutManager instanceof GridLayoutManager)        {            spanCount = ((GridLayoutManager) layoutManager).getSpanCount();        } else if (layoutManager instanceof StaggeredGridLayoutManager)        {            spanCount = ((StaggeredGridLayoutManager) layoutManager)                    .getSpanCount();        }        return spanCount;    }    public void drawHorizontal(Canvas c, RecyclerView parent)    {        int childCount = parent.getChildCount();        for ( int i = 0; i < childCount; i++)        {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int left = child.getLeft() - params.leftMargin;            final int right = child.getRight() + params.rightMargin                    + mDivider.getIntrinsicWidth();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    public void drawVertical(Canvas c, RecyclerView parent)    {        final int childCount = parent.getChildCount();        for ( int i = 0; i < childCount; i++)        {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int top = child.getTop() - params.topMargin;            final int bottom = child.getBottom() + params.bottomMargin;            final int left = child.getRight() + params.rightMargin;            final int right = left + mDivider.getIntrinsicWidth();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    private boolean isLastColum(RecyclerView parent, int pos, int spanCount,                                int childCount)    {        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();        if (layoutManager instanceof GridLayoutManager)        {            if ((pos + 1) % spanCount == 0) // 如果是最后一列,则不需要绘制右边            {                return true;            }        } else if (layoutManager instanceof StaggeredGridLayoutManager)        {            int orientation = ((StaggeredGridLayoutManager) layoutManager)                    .getOrientation();            if (orientation == StaggeredGridLayoutManager.VERTICAL )            {                if ((pos + 1) % spanCount == 0) // 如果是最后一列,则不需要绘制右边                {                    return true;                }            } else            {                childCount = childCount - childCount % spanCount;                if (pos >= childCount) // 如果是最后一列,则不需要绘制右边                    return true;            }        }        return false;    }    private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,                              int childCount)    {        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();        if (layoutManager instanceof GridLayoutManager)        {            childCount = childCount - childCount % spanCount;            if (pos >= childCount) // 如果是最后一行,则不需要绘制底部                return true;        } else if (layoutManager instanceof StaggeredGridLayoutManager)        {            int orientation = ((StaggeredGridLayoutManager) layoutManager)                    .getOrientation();            // StaggeredGridLayoutManager 且纵向滚动            if (orientation == StaggeredGridLayoutManager.VERTICAL )            {                childCount = childCount - childCount % spanCount;                // 如果是最后一行,则不需要绘制底部                if (pos >= childCount)                    return true;            } else            // StaggeredGridLayoutManager 且横向滚动            {                // 如果是最后一行,则不需要绘制底部                if ((pos + 1) % spanCount == 0)                {                    return true;                }            }        }        return false;    }    @Override    public void getItemOffsets(Rect outRect, int itemPosition,                               RecyclerView parent)    {        int spanCount = getSpanCount(parent);        int childCount = parent.getAdapter().getItemCount();        if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部        {            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);        } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边        {            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());        } else        {            outRect.set(0, 0, mDivider.getIntrinsicWidth(),                    mDivider.getIntrinsicHeight());        }    }}

参考:

使用:http://blog.csdn.net/skykingf/article/details/50827141

http://blog.csdn.net/lmj623565791/article/details/45059587

添加header和footer:http://blog.csdn.net/qibin0506/article/details/49716795



原创粉丝点击