RecyclerView简单使用


上面的截图分别是仿List显示、网格显示、瀑布流显示。

LinearLayoutManager:线性布局,横向或者纵向滑动列表

GridLayoutManager:表格布局

StaggeredGridLayoutManager:流式布局,例如瀑布流效果

当然除了上面的三种内部布局之外,我们还可以继承RecyclerView.LayoutManager来实现一个自定义的LayoutManager。

           Animations(动画)效果:

           RecyclerView对于Item的添加和删除是默认开启动画的。我们当然也可以通过RecyclerView.ItemAnimator类定制动画,然后通过RecyclerView.setItemAnimator()方法来进行使用。

           RecyclerView相关类:
\

studio导入:

compile 'com.android.support:cardview-v7:23.1.1'
这会使item更加具有卡片的效果,后面布局中会使用上。


先来看List的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:cardview="http://schemas.android.com/apk/res-auto"
    android:padding="10dp"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        cardview:cardElevation="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/list_img_id"
                android:padding="5dp"
                android:layout_gravity="center_horizontal"
                android:layout_width="250dp"
                android:layout_height="200dp"
                android:src="@drawable/img3" />

            <TextView
                android:id="@+id/list_tv_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_toRightOf="@id/list_img_id"
                android:layout_centerVertical="true"
                android:text="图片数据"
                android:textSize="20sp"
                android:textStyle="bold" />
        </RelativeLayout>
    </android.support.v7.widget.CardView>
</RelativeLayout>
cardview:cardElevation="10dp" 产生10dp的阴影效果

ListAdapter:

package com.zhangli.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

    private Context mContext;
    private List<DataBean> mDatas;
    BitmapUtil bit=new BitmapUtil();

    public ListAdapter(Context context, List<DataBean> datas) {
        mContext = context;
        mDatas = datas;
    }

    @Override
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //当ViewHolder创建时的回调
        View view = View.inflate(mContext, R.layout.list_layout, null);

        return new ListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ListViewHolder holder, int position) {
        //当viewHolder与数据绑定时的回调
        DataBean bean = mDatas.get(position);

        holder.setData(bean);
    }

    @Override
    public int getItemCount() {
        //返回的是list数据的个数
        if (mDatas != null) {
            return mDatas.size();
        }
        return 0;
    }

    public class ListViewHolder extends RecyclerView.ViewHolder {
        private ImageView imgIcn;
        private TextView tvName;

        public ListViewHolder(View itemView) {
            super(itemView);
            imgIcn = (ImageView) itemView.findViewById(R.id.list_img_id);
            tvName = (TextView) itemView.findViewById(R.id.list_tv_id);
        }

        public void setData(DataBean bean) {
            Log.e("tag", "data.icn:" + bean.icn);
//            imgIcn.setImageResource(bean.icn);

            Bitmap bitmap=getBitmap(bean.icn);

            //图片先加载出来再缩放  效率低
//            imgIcn.setImageDrawable(bit.resizeImage(bitmap,1000,640));

            //将bitmap缩小
//            imgIcn.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap, 200, 100));//2.2才加进来的新类,简单易用

            imgIcn.setImageBitmap(bitmap);

            tvName.setText(bean.name);
        }
    }

    public Bitmap getBitmap(int id){
        return bit.drawableToBitmap(mContext,id);
    }
}

在Activity里面设置上listAdapter, DATAS是一个放图片资源的类。

 /**
     * 加载List的数据
     * @param isReverse 是否反向
     * @param isVertical 是否垂直
     */
    private void loadListData(boolean isReverse,boolean isVertical) {
        List<DataBean> datas=new ArrayList<>();

        for(int i=0;i<DATAS.ICNS.length;i++){
            DataBean bean=new DataBean();
            bean.icn=DATAS.ICNS[i];
            bean.name="图片"+i;
            datas.add(bean);
        }

        //给RecyclerView加载数据
        //1、设置布局管理器
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);

        //设置是否反向
        linearLayoutManager.setReverseLayout(isReverse);

        //设置是否垂直显示
        linearLayoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);


        recyclerView.setLayoutManager(linearLayoutManager);
        //2、设置适配器
        recyclerView.setAdapter(new ListAdapter(this,datas));
    }

点击菜单选择recyclerView的显示效果,下面的 GridAdapter和StaggeredAdapter也是一样的

  @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.list_normal) {
            loadListData(false,true);
            return true;
        }else if(id == R.id.list_vertical_reverse){
            loadListData(true,true);
            return true;
        }else if(id == R.id.list_horizontal){
            loadListData(false,false);
            return true;
        }else if(id == R.id.list_horizontal_reverse){
            loadListData(true,false);
            return true;
        }
   return super.onOptionsItemSelected(item);
    }

再来看看GridAdapter和StaggeredAdapter的加载:

    /**
     * 表格布局
     * @param isReverse 是否反向
     * @param isVertical 是否垂直
     */
    public void loadGridData(boolean isReverse,boolean isVertical){

        List<DataBean> datas=new ArrayList<>();
        for(int i=0;i<DATAS.ICNS.length;i++){
            DataBean bean=new DataBean();
            bean.icn=DATAS.ICNS[i];
            bean.name="图片"+i;
            datas.add(bean);
        }

        GridLayoutManager gridLayoutManager=new GridLayoutManager(this,2);

        //是否反向
        gridLayoutManager.setReverseLayout(isReverse);

        //是否垂直
        gridLayoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);

        recyclerView.setLayoutManager(gridLayoutManager);
        //2、设置适配器
        recyclerView.setAdapter(new GridAdapter(this, datas));

    }

    /**
     * 瀑布流显示
     * @param isReverse 是否反向
     * @param isVertical 是否垂直
     */
    public void loadStaggerData(boolean isReverse,boolean isVertical){

        List<DataBean> datas=new ArrayList<>();
        for(int i=0;i<DATAS.MEINVS.length;i++){
            DataBean bean=new DataBean();
            bean.icn=DATAS.MEINVS[i];
            bean.name="图片"+i;
            datas.add(bean);
        }

        StaggeredGridLayoutManager staggeredGridLayoutManager=
                new StaggeredGridLayoutManager(2,
                        isVertical?StaggeredGridLayoutManager.VERTICAL
                                :StaggeredGridLayoutManager.HORIZONTAL);

        //是否反向
        staggeredGridLayoutManager.setReverseLayout(isReverse);

        recyclerView.setLayoutManager(staggeredGridLayoutManager);
        //2、设置适配器
        recyclerView.setAdapter(new StaggerAdapter(this, datas));

    }

GridLayout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:cardview="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        cardview:cardElevation="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:padding="5dp"
            android:orientation="vertical"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/list_img_id"
                android:layout_gravity="center"
                android:scaleType="fitCenter"
                android:layout_width="140dp"
                android:layout_height="140dp"
                android:src="@drawable/img3" />

            <TextView
                android:id="@+id/list_tv_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="图片数据"
                android:layout_gravity="center"
                android:textSize="20sp"
                android:textStyle="bold" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>


StaggeredLayout:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    xmlns:cardview="http://schemas.android.com/apk/res-auto"
    android:padding="10dp"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        cardview:cardElevation="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="wrap_content"
            android:orientation="vertical"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/list_img_id"
                android:layout_gravity="center"
                android:adjustViewBounds="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/meinv1" />

            <TextView
                android:id="@+id/list_tv_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="图片数据"
                android:textSize="20sp"
                android:layout_gravity="center"
                android:textStyle="bold" />

        </LinearLayout>
    </android.support.v7.widget.CardView>
</RelativeLayout>

好了,简单的使用三种布局方式就是上面的 了。

完整的代码:

package com.zhangli.myapplication;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
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.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

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

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView_id);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.list_normal) {
            loadListData(false, true);
            return true;
        } else if (id == R.id.list_vertical_reverse) {
            loadListData(true, true);
            return true;
        } else if (id == R.id.list_horizontal) {
            loadListData(false, false);
            return true;
        } else if (id == R.id.list_horizontal_reverse) {
            loadListData(true, false);
            return true;
        } else if (id == R.id.grid_normal) {
            loadGridData(false, true);
            return true;
        } else if (id == R.id.grid_vertical_reverse) {
            loadGridData(true, true);
            return true;
        } else if (id == R.id.grid_horizontal) {
            loadGridData(false, false);
            return true;
        } else if (id == R.id.grid_horizontal_reverse) {
            loadGridData(true, false);
            return true;
        } else if (id == R.id.stagger_normal) {
            loadStaggerData(false, true);
            return true;
        } else if (id == R.id.stagger_vertical_reverse) {
            loadStaggerData(true, true);
            return true;
        } else if (id == R.id.stagger_horizontal) {
            loadStaggerData(false, false);
            return true;
        } else if (id == R.id.stagger_horizontal_reverse) {
            loadStaggerData(true, false);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 加载List的数据
     *
     * @param isReverse  是否反向
     * @param isVertical 是否垂直
     */
    private void loadListData(boolean isReverse, boolean isVertical) {
        List<DataBean> datas = new ArrayList<>();

        for (int i = 0; i < DATAS.ICNS.length; i++) {
            DataBean bean = new DataBean();
            bean.icn = DATAS.ICNS[i];
            bean.name = "图片" + i;
            datas.add(bean);
        }

        //给RecyclerView加载数据
        //1、设置布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);

        //设置是否反向
        linearLayoutManager.setReverseLayout(isReverse);

        //设置是否垂直显示
        linearLayoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);


        recyclerView.setLayoutManager(linearLayoutManager);
        //2、设置适配器
        recyclerView.setAdapter(new ListAdapter(this, datas));
    }

    /**
     * 表格布局
     *
     * @param isReverse  是否反向
     * @param isVertical 是否垂直
     */
    public void loadGridData(boolean isReverse, boolean isVertical) {

        List<DataBean> datas = new ArrayList<>();
        for (int i = 0; i < DATAS.ICNS.length; i++) {
            DataBean bean = new DataBean();
            bean.icn = DATAS.ICNS[i];
            bean.name = "图片" + i;
            datas.add(bean);
        }

        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);

        //是否反向
        gridLayoutManager.setReverseLayout(isReverse);

        //是否垂直
        gridLayoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);

        recyclerView.setLayoutManager(gridLayoutManager);
        //2、设置适配器
        recyclerView.setAdapter(new GridAdapter(this, datas));

    }

    /**
     * 瀑布流显示
     *
     * @param isReverse  是否反向
     * @param isVertical 是否垂直
     */
    public void loadStaggerData(boolean isReverse, boolean isVertical) {

        List<DataBean> datas = new ArrayList<>();
        for (int i = 0; i < DATAS.MEINVS.length; i++) {
            DataBean bean = new DataBean();
            bean.icn = DATAS.MEINVS[i];
            bean.name = "图片" + i;
            datas.add(bean);
        }

        StaggeredGridLayoutManager staggeredGridLayoutManager =
                new StaggeredGridLayoutManager(2,
                        isVertical ? StaggeredGridLayoutManager.VERTICAL
                                : StaggeredGridLayoutManager.HORIZONTAL);

        //是否反向
        staggeredGridLayoutManager.setReverseLayout(isReverse);

        recyclerView.setLayoutManager(staggeredGridLayoutManager);
        //2、设置适配器
        recyclerView.setAdapter(new StaggerAdapter(this, datas));

    }

}

content_main layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    android:padding="4dp"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.zhangli.myapplication.MainActivity"
    tools:showIn="@layout/activity_main">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

完整demo在: https://github.com/zhangli915952504/RecyclerView



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecycleView是一种在Android中常用的列表控件,它允许你在列表中显示大量数据,而不会导致应用程序变得卡顿或崩溃。它使用了一个称为“回收利用”的概念,这意味着当列表不再需要时,它可以将某些元素从内存中释放出来,以节省内存空间。 以下是使用RecycleView的一些基本步骤: 1. 添加依赖项:首先,你需要在你的项目中添加一个recyclerView的依赖项。如果你使用的是Gradle构建系统,可以在build.gradle文件中添加以下代码: ```groovy dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' // 使用最新版本 } ``` 2. 创建布局文件:在你的布局文件中创建一个新的recyclerView布局文件。这个文件应该包含一个或多个用于显示数据的视图。 3. 创建适配器:适配器是连接recyclerView和数据源的关键组件。你需要创建一个适配器类,该类继承自RecyclerView.Adapter,并实现其中的一些接口方法。 4. 绑定适配器:最后,你需要将适配器绑定到recyclerView上。这通常在Activity或Fragment的onCreate方法中完成。你可以使用setAdapter方法将适配器绑定到recyclerView上。 以下是一个简单的示例代码,演示如何使用RecycleView: 1. 在布局文件中添加一个recyclerView: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在Activity或Fragment中创建一个RecyclerViewAdapter: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> data; // 数据源 public MyAdapter(List<String> data) { this.data = data; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textView.setText(data.get(position)); } @Override public int getItemCount() { return data.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { private TextView textView; // 自定义视图组件 public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); // 获取自定义视图组件并设置文本 } } } ``` 3. 在Activity或Fragment的onCreate方法中绑定适配器: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); MyAdapter adapter = new MyAdapter(myData); // myData是数据源,例如一个List<String>对象 recyclerView.setAdapter(adapter); // 将适配器绑定到recyclerView上 ``` 这就是使用RecycleView的基本步骤。你可以根据需要自定义布局和适配器,以适应你的应用程序需求。RecycleView提供了许多高级功能,如自动布局、可点击边距等,可以根据需要进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值