Recyclerview

Recyclerview

RecyclerView比ListView的优势:

1.RecyclerView比listview实现效果更多
2.RecycelrView支持多布局;
3.RecyclerView根据项目需要插拔功能
RecyclerView默认不支持点击事件->需代码中通过回调接口的方式添加监听

Recyclerview的三种布局
线性/网格/瀑布流

1、Recyclerview重要的方法

1.RecyclerView横向滑动:
LinearLayoutManager.HORIZONTAL横向滑动LinearLayoutManager.VERTICAL垂直滑动
2.RecyclerView.Adapter中刷新方法区别:
notifyDataSetChanged();整体刷新+没有动画效果
notifyItemInserted(int position,Object data):有动画效果+添加一条数据在position位置
notifyItemRemoved(position);有动画效果+删除一条数据并刷新
注意:当添加和删除的时候,要更新下标,不然有错位现象
3.RecyclerView多布局展示:
public int getItemViewType(int position)返回当前数据的itemview类型
4.RecyclerView常见方法:
LinearLayoutManager:recyclerview线性管理器(垂直水平方向);
GridLayoutManager:网格布局管理器;
StaggeredGridLayoutManager:瀑布流布局管理器;
RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
RecyclerView.setAdapter(Adapter adapter):添加适配器

在这里插入图片描述

2、RecyclerView依赖

    implementation 'com.android.support:recyclerview-v7:28.0.0'

3、具体代码

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

</LinearLayout>
package com.example.day1;

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

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements MyAdapter.MainItemClickLisener {
    RecyclerView recyclerView;
    MyAdapter myAdapter;
    ArrayList<Student> list = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);

        list.add(new Student("a",R.mipmap.k4_1));
        list.add(new Student("b",R.mipmap.k4_2));
        list.add(new Student("c",R.mipmap.k4_3));
        list.add(new Student("d",R.mipmap.k4_4));
        list.add(new Student("e",R.mipmap.k4_5));

        myAdapter = new MyAdapter(list,this);

        //线性布局
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayout.VERTICAL);
        //网格布局
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
        //瀑布流布局:一般和图片结合使用,自适应图片的高度
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        //设置布局
        recyclerView.setLayoutManager(staggeredGridLayoutManager);

        //设置分割线
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
        //添加分割线
        recyclerView.addItemDecoration(dividerItemDecoration);

        //设置动画
        DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
        defaultItemAnimator.setRemoveDuration(2000);//设置延迟2秒的删除效果
        defaultItemAnimator.setAddDuration(2000);
        //设置动画
        recyclerView.setItemAnimator(defaultItemAnimator);

        //设置点击事件
        myAdapter.setOnItemClick(this);
        //设置适配器
        recyclerView.setAdapter(myAdapter);

    }

    @Override
    public void ItemClick(int position) {
        //删除数据
        list.remove(position);
        //具有动画效果+删除
        myAdapter.notifyItemRemoved(position);
        //产生删除错位现象----->重新整理item的下表
        myAdapter.notifyItemRangeChanged(0,list.size());

    }
}

package com.example.day1;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
    ArrayList<Student> list;
    MainActivity con;

    public MyAdapter(ArrayList<Student> list, MainActivity con) {
        this.list = list;
        this.con = con;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(con).inflate(R.layout.layout, null);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
        viewHolder.imageView.setImageResource(list.get(i).getPic());
        viewHolder.textView.setText(list.get(i).getName());

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.ItemClick(i);
            }
        });

    }

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


    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        TextView textView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            this.imageView = itemView.findViewById(R.id.imageView);
            this.textView = itemView.findViewById(R.id.textView);
            int ran = (int)(Math.random()*200+200);
            Log.d("xxx",ran+"");
            ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
            layoutParams.height=ran;
            imageView.setLayoutParams(layoutParams);
        }
    }

    private MainItemClickLisener listener;

    public void setOnItemClick(MainItemClickLisener listener){
        this.listener = listener;
    }

    interface  MainItemClickLisener{
        public void ItemClick(int position);
    }

}

4、手机联系人多布局

package com.example.day1_duo;

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.ContactsContract;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList<User> list = new ArrayList<>();
    RecyclerView recyclerView;
    ListView listView;
    String str = "";
    MyAdap myAdap;
    ArrayAdapter arrayAdapter;
    LinearLayoutManager linearLayoutManager;
    String titles[]=new String[]{"A","B","C","D","E","F","G","H","I","G","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        listView = findViewById(R.id.listView);

        arrayAdapter = new ArrayAdapter(this,R.layout.support_simple_spinner_dropdown_item,titles);
        listView.setAdapter(arrayAdapter);

        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, "phonebook_label asc", null);
        while(cursor.moveToNext()){
            Log.d("xxx",list.size()+"");
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            String key = cursor.getString(cursor.getColumnIndex("phonebook_label"));
            User user;
            if(!str.equals(key)){
                str=key;
                user = new User(name, number, key,0);
                list.add(user);
                User user1 = new User(name, number, key, 1);
                list.add(user1);
            }else{
                user = new User(name, number, key,1);
                list.add(user);
            }

        }
        for (int i=0;i<list.size();i++){
            Log.d("xxx",list.get(i).toString());
        }
        myAdap = new MyAdap(list,this);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(myAdap);


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String title = titles[position];
                Log.d("zxh",title);
                int num = 0;
                for(int i=0;i<list.size();i++){
                    User user = list.get(i);
                    if(user.getKey().equals(title)){
                        num=i;
                        Log.d("zxh",user.getKey());
                        Log.d("zxh",num+"");
                        break;
                    }
                }
                Log.d("zxhn",num+"");
                linearLayoutManager.scrollToPositionWithOffset(num,0);
            }
        });


    }
}

package com.example.day1_duo;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;

public class MyAdap extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    ArrayList<User> list = new ArrayList<>();
    MainActivity con;

    public MyAdap(ArrayList<User> list, MainActivity con) {
        this.list = list;
        this.con = con;
    }

    @Override
    public int getItemViewType(int position) {
        return list.get(position).getType();
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        if(i==0){
            View view = LayoutInflater.from(con).inflate(R.layout.layout_title, viewGroup,false);
            return  new TitleHolder(view);
        }else{
            View view = LayoutInflater.from(con).inflate(R.layout.layout_phone, viewGroup,false);
            return  new PhoneHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        if(getItemViewType(i)==0){
            TitleHolder titleHolder = (TitleHolder) viewHolder;
            titleHolder.text_title.setText(list.get(i).getKey());
        }else{
            PhoneHolder phoneHolder = (PhoneHolder) viewHolder;
            phoneHolder.text_name.setText(list.get(i).getName());
            phoneHolder.text_number.setText(list.get(i).getNumber());
        }
    }

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

    class TitleHolder extends RecyclerView.ViewHolder{
        TextView text_title;
        public TitleHolder(@NonNull View itemView) {
            super(itemView);
            text_title = itemView.findViewById(R.id.text_title);
        }
    }

    class PhoneHolder extends RecyclerView.ViewHolder{
        TextView text_name,text_number;
        public PhoneHolder(@NonNull View itemView) {
            super(itemView);
            text_name = itemView.findViewById(R.id.text_name);
            text_number = itemView.findViewById(R.id.text_number);
        }
    }

}

5、随机高度瀑布流

在这里插入图片描述

6、item行布局ImageView添加的属性

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值