Android_RecyclerView的介绍与使用

一:介绍

RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好

RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:

  • 使用LayoutManager来确定每一个item的排列方式。

  • 为增加和删除项目提供默认的动画效果。


二:添加依赖包

RecyclerView依赖包     

compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
Glide加载图片

compile 'com.github.bumptech.glide:glide:3.7.0'

三:添加权限

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

四:布局

<?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"
    tools:context="activity.example.com.recycleview.MainActivity">

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

</RelativeLayout>

五:代码

1:MainActivity

package activity.example.com.recycleview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
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.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //或取id
        recyclerview = (RecyclerView)findViewById(R.id.recyclerview);
        //添加了一些假数据
        List<ImageData> list = new ArrayList<>();
        list.add(new ImageData(R.drawable.a,"1"));
        list.add(new ImageData(R.drawable.a2,"2"));
        list.add(new ImageData(R.drawable.a3,"3"));
        list.add(new ImageData(R.drawable.a4,"4"));
        list.add(new ImageData(R.drawable.a5,"5"));
        list.add(new ImageData(R.drawable.a6,"6"));
        list.add(new ImageData(R.drawable.a7,"7"));
        list.add(new ImageData(R.drawable.a8,"8"));
        list.add(new ImageData(R.drawable.a9,"9"));
        list.add(new ImageData(R.drawable.a10,"10"));

        // 线性布局管理器   VERTICAL默认样式/竖向显示       第三个参数是数据是否到过来显示
        LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        //HORIZONTAL横向显示
        //LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);

        //网格布局  第二个参数是几列
        //GridLayoutManager manager = new GridLayoutManager(this, 2,LinearLayoutManager.VERTICAL,false);

        //瀑布流
        //StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2,LinearLayoutManager.VERTICAL);

        //添加分格线
        recyclerview.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));

        //设置动画:  动画效果是添加或删除时候触发
        recyclerview.setItemAnimator(new DefaultItemAnimator());

        //添加布局管理器
        recyclerview.setLayoutManager(manager);
        //设置适配器   设置适配器最好方在最后
        recyclerview.setAdapter(new RecyclerViewAdapter(this,list));
    }
}

2:适配器

普通适配器

package activity.example.com.recycleview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

/**
 * Created by 壹颗大金星 on 2017/11/9.
 */

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

    private Context context;
    private List<ImageData> list;

    public RecyclerViewAdapter(Context context, List<ImageData> list) {
        this.context = context;
        this.list = list;
    }

    //创建ViewHolder
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //子条目布局
        View view = View.inflate(context, R.layout.itemlist, null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    //绑定ViewHolder,把数据和视图进行绑定
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.imageview.setImageResource(list.get(position).getImg());
        holder.textview.setText(list.get(position).getTitle());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context,"点击了"+position,Toast.LENGTH_SHORT).show();
            }
        });
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                list.remove(position);
                notifyDataSetChanged();//不能触发动画效果
                //notifyItemRemoved(position);//能触发动画效果
                //返回的是事件是否被消耗    false长按之后还会触发点击事件,true不会
                return true;
            }
        });
    }

    @Override
    public int getItemCount() {
        if(list==null){
            return 0;
        }
        return list.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        private TextView textview;
        private ImageView imageview;

        public ViewHolder(View itemView) {
            super(itemView);
            //itemView一个条目的视图
            imageview = (ImageView)itemView.findViewById(R.id.imageView);
            textview = (TextView)itemView.findViewById(R.id.textView);
        }
    }
}

多条目适配器

package com.mvprecyclerview.Adapter;

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

import com.bumptech.glide.Glide;
import com.mvprecyclerview.Bean.DataList;
import com.mvprecyclerview.R;

import java.util.List;

/**
 * Created by 壹颗大金星 on 2017/11/10.
 */

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    private Context context;
    private List<DataList> list;

    public RecyclerViewAdapter(Context context, List<DataList> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(viewType==0){
            View view = View.inflate(context, R.layout.item, null);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }else{
            View view = View.inflate(context, R.layout.item2, null);
            ViewHolder2 holder2 = new ViewHolder2(view);
            return holder2;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof ViewHolder){
            ViewHolder holder1 = (ViewHolder) holder;
            Glide.with(context).load(list.get(position).getImg()).into(holder1.image);
            holder1.tv_title.setText(list.get(position).getTitle());
            holder1.tv_time.setText(list.get(position).getTime());
        }else{
            ViewHolder2 holder1 = (ViewHolder2) holder;
            holder1.textview.setText(list.get(position).getTitle());
        }
    }

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

    @Override
    public int getItemViewType(int position) {
        if(position%2==0){
            return 0;
        }else{
            return 1;
        }
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        private final ImageView image;
        private final TextView tv_title;
        private final TextView tv_time;

        public ViewHolder(View itemView) {
            super(itemView);
            image = (ImageView)itemView.findViewById(R.id.image);
            tv_title = (TextView)itemView.findViewById(R.id.tv_title);
            tv_time = (TextView)itemView.findViewById(R.id.tv_time);
        }
    }

    class ViewHolder2 extends RecyclerView.ViewHolder{

        private final TextView textview;

        public ViewHolder2(View itemView) {
            super(itemView);
            textview = (TextView)itemView.findViewById(R.id.textview);
        }
    }
}







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android数据绑定是一个支持双向绑定的库,它可以帮助你将UI组件和数据模型绑定起来,从而可以轻松地更新UI组件或数据模型的值。 Android RecyclerView是一种用于显示大量数据的高级组件,它可以在滚动时动态地加载和卸载数据项,并提供了类似于ListView的布局管理器。 使用Android数据绑定和RecyclerView,可以更轻松地实现列表的数据绑定。你可以在适配器中使用数据绑定表达式来更新列表项视图的值,同时还可以监听数据模型的变化,以便在数据更新时刷新列表项。 要在RecyclerView使用数据绑定,需要将适配器继承自RecyclerView.Adapter,并且在绑定视图时使用DataBindingUtil类来获取视图的绑定对象。然后,可以在绑定对象中使用数据绑定表达式来更新视图的值。 例如,下面的代码片段演示了如何使用数据绑定更新RecyclerView列表项的文本视图: ```java public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { private List<MyData> mDataList; // ... @Override public void onBindViewHolder(MyViewHolder holder, int position) { MyData data = mDataList.get(position); ViewDataBinding binding = DataBindingUtil.bind(holder.itemView); binding.setVariable(BR.myData, data); binding.executePendingBindings(); } } public class MyViewHolder extends RecyclerView.ViewHolder { // ... public MyViewHolder(View itemView) { super(itemView); } } ``` 在MyViewHolder类中,我们只需要简单地继承自RecyclerView.ViewHolder,并且不需要实现任何逻辑。在适配器的onBindViewHolder()方法中,我们首先获取当前位置的数据模型,然后使用DataBindingUtil.bind()方法获取视图的绑定对象。接下来,我们使用setVariable()方法将数据模型设置为绑定对象的属性,然后调用executePendingBindings()方法来立即更新视图。 需要注意的是,在使用数据绑定时,你需要在build.gradle文件中添加以下依赖: ```groovy android { // ... dataBinding { enabled = true } } dependencies { // ... implementation 'com.android.databinding:library:1.4.0' } ``` 希望这个回答能够帮助你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值