Recyclerview&..多布局

Recyclerview

recyclerview比listview的优点
RecyclerView比listview实现效果更多
RecyclerView根据项目需要插拔功能
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):添加适配器

三.RecyclerView的使用

     implementation 'com.android.support:recyclerview-v7:28.0.0‘ 导入依赖

四.代码

布局activity_main.xml:
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recy"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>
(2)Java代码:MainActivity.java
package com.example.kuaishou;


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.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements com.example.kuaishou.base.MainItemClickLisener, com.example.kuaishou.base.MainItemLongClickLisener {
    RecyclerView recyclerView;
    base base;
    ArrayList<Student> list = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recy);
        EventBus.getDefault().register(this);
        new Threads().start();
        base = new base(MainActivity.this, list);

        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);


        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
        recyclerView.addItemDecoration(dividerItemDecoration);
        dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.xian));
        DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
        defaultItemAnimator.setRemoveDuration(1000);
        defaultItemAnimator.setAddDuration(1000);
        recyclerView.setItemAnimator(defaultItemAnimator);

        base.setMainItemClickLisener(this);
        base.setMainItemLongClickLisener(this);

        recyclerView.setAdapter(base);

    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void show(String s) throws JSONException {

        JSONObject jsonObject = new JSONObject(s);
        JSONArray data = jsonObject.getJSONArray("data");
        for (int i=0;i<data.length();i++){
            JSONObject jsonObject1 = data.getJSONObject(i);
            String height = jsonObject1.getString("height");
            String width = jsonObject1.getString("width");
            String cdn_img = jsonObject1.getString("cdn_img");
            String love = jsonObject1.getString("love");
            Student student = new Student(cdn_img,love,height,width);
            Log.e("masdxx",cdn_img);
            Log.e("masdxx",love);
            list.add(student);
        }
        base.notifyDataSetChanged();



    }


    @Override
    public void ItemClick(int position) {
        Toast.makeText(this, "单击", Toast.LENGTH_SHORT).show();
}

    @Override
    public void ItemLongClick(int position) {
        Toast.makeText(this, "长按", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

下面还有适配器里的代码

package com.example.kuaishou;

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.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

public class base extends RecyclerView.Adapter<base.MainAdpater> {
    MainActivity mainActivity;
    ArrayList<Student> list;

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

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

    @Override
    public void onBindViewHolder(@NonNull MainAdpater mainAdpater, final int i) {
        mainAdpater.textView.setText(list.get(i).getLove());
        Glide.with(mainActivity).load(list.get(i).getCdn_img()).into(mainAdpater.imageView);


        WindowManager windowManager = mainActivity.getWindowManager();
        //获取照片显示时的宽
        float width = windowManager.getDefaultDisplay().getWidth()/2;
        Log.d("zxh","屏幕宽:"+width);
        //获取照片的宽
        float wid = Float.parseFloat(list.get(i).getWidth());
        Log.d("zxh","照片宽:"+wid);
        //获取比例
        float kuan = wid/ width;
        Log.d("zxh","比例:"+kuan);
        //获取照片高
        Log.d("xxxxx",list.get(i).getHeight());
        float hei = Float.parseFloat(list.get(i).getHeight());
        Log.d("zxh","照片高:"+hei);
        //获取设置实际照片的高
        int gao = (int)(hei/kuan);
        Log.d("zxh","实际照片的高:"+gao);

        ViewGroup.LayoutParams layoutParams = mainAdpater.imageView.getLayoutParams();
        layoutParams.height = gao;
        mainAdpater.imageView.setLayoutParams(layoutParams);
        Log.d("zxh","----------------------");
        mainAdpater.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mainItemClickLisener.ItemClick(i);
            }
        });
        mainAdpater.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                mainItemLongClickLisener.ItemLongClick(i);
                return true;
            }
        });

    }

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

    class MainAdpater extends RecyclerView.ViewHolder{
            ImageView imageView;
            TextView textView;


        public MainAdpater(@NonNull View itemView) {
            super(itemView);
            this.imageView = itemView.findViewById(R.id.a);
            this.textView = itemView.findViewById(R.id.aa);

        }
    }
    private  MainItemClickLisener mainItemClickLisener;
    private  MainItemLongClickLisener mainItemLongClickLisener;

    public void setMainItemClickLisener(MainItemClickLisener mainItemClickLisener) {
        this.mainItemClickLisener = mainItemClickLisener;
    }

    public void setMainItemLongClickLisener(MainItemLongClickLisener mainItemLongClickLisener) {
        this.mainItemLongClickLisener = mainItemLongClickLisener;
    }

    interface MainItemClickLisener{
         void ItemClick(int position);
    }
    interface MainItemLongClickLisener{
         void ItemLongClick(int position);
    }
}

多布局实现微信聊天

package com.example.qq;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    Button button;
    ArrayList<bean> list = new ArrayList<>();
    int flag=0;
    base base;
    LinearLayoutManager linearLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.list);
        button = findViewById(R.id.but);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                flag++;
                if(flag%2==0){
                    list.add(new bean(0,"你好啊~"));
                }else if(flag%2==1){
                    list.add(new bean(1,"你好啊~"));
                }


                linearLayoutManager.scrollToPositionWithOffset(list.size()-1,0);
                base.notifyDataSetChanged();
            }
        });
        base = new base(list, this);
        recyclerView.setAdapter(base);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);

    }
}

适配器代码如下

package com.example.qq;

import android.content.Context;
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 base extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    ArrayList<bean> list;
    Context context;

    public base(ArrayList<bean> list, Context context) {
        this.list = list;
        this.context = context;
    }

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

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        if(i==0){
            return new zuo(LayoutInflater.from(context).inflate(R.layout.a1,viewGroup,false));
        }else{
            return new you(LayoutInflater.from(context).inflate(R.layout.a2,viewGroup,false));

        }

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        if(getItemViewType(i)==0){
            zuo zuo = (base.zuo) viewHolder;
            zuo.textView.setText(list.get(i).getName());
        }else{
            you you = (base.you) viewHolder;
            you.textView.setText(list.get(i).getName());
        }

    }

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

    class zuo extends RecyclerView.ViewHolder{
        TextView textView;

        public zuo(@NonNull View itemView) {
            super(itemView);
            this.textView=itemView.findViewById(R.id.text);
        }
    }


    class you extends RecyclerView.ViewHolder{
        TextView textView;

        public you(@NonNull View itemView) {
            super(itemView);
            this.textView=itemView.findViewById(R.id.text);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值