2021-04-01

万能适配器+recy动画

1.万能适配器–BaseReccyclerviewAdapterHelper------》BRVAH 作者:陈宇明
在这里插入图片描述
依赖

implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22'//万能适配器
    implementation 'com.android.support:recyclerview-v7:30.0.0'//recyclerview

在这里插入图片描述
在这里插入图片描述
maven { url “https://jitpack.io” }
适配器

//TODO 1:泛型添加好
public class MeiZiAdapter extends BaseQuickAdapter<MeiZiEntity.DataBean, BaseViewHolder> {
    //TODO 2:构造不需要处理
    public MeiZiAdapter(int layoutResId, @Nullable List<MeiZiEntity.DataBean> data) {
        super(layoutResId, data);
    }
    //TODO 3:加载数据
    @Override
    protected void convert(BaseViewHolder helper, MeiZiEntity.DataBean item) {
        //文字
        helper.setText(R.id.tv,item.getTitle()+"");
        //图片
        ImageView imageView = helper.getView(R.id.iv);
        Glide.with(mContext).load(item.getUrl()).into(imageView);


        //为图片和文字添加点击
        helper.addOnClickListener(R.id.iv)
                .addOnClickListener(R.id.tv);

    }
}

主页面

 private void initView() {
        recyclerView = findViewById(R.id.rv);
        list = new ArrayList<>();
        meiZiAdapter = new MeiZiAdapter(R.layout.item_meizi,list);
        recyclerView.setAdapter(meiZiAdapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
        //linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);//设置为横向滑动的recyclerview
        recyclerView.setLayoutManager(linearLayoutManager);


        //TODO 1:item的点击和长按 千万不要用带child
        meiZiAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                Toast.makeText(MainActivity.this, "点击"+position, Toast.LENGTH_SHORT).show();
            }
        });
        meiZiAdapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
                Toast.makeText(MainActivity.this, "长按"+position, Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        //TODO 2:item子控件的点击 :图片 文字   +千万要记住适配器中addOnclcikListener
        meiZiAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                if(view.getId()== R.id.tv){
                    Toast.makeText(MainActivity.this, "文字"+position, Toast.LENGTH_SHORT).show();
                }else  if(view.getId()== R.id.iv){
                    Toast.makeText(MainActivity.this, "图片"+position, Toast.LENGTH_SHORT).show();
                }
            }
        });
        //TODO 3:设置加载动画 默认为渐显效果  、缩放、从下到上,从左到右、从右到左
      //  meiZiAdapter.openLoadAnimation(BaseQuickAdapter.SCALEIN);//缩放
        meiZiAdapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_BOTTOM);
        //TODO 4:添加头布局和尾布局
        View head = LayoutInflater.from(this).inflate(R.layout.head, null);
        View foot = LayoutInflater.from(this).inflate(R.layout.foot, null);
        meiZiAdapter.addHeaderView(head);
        meiZiAdapter.addFooterView(foot);

    }

类似于联系人的多布局
多布局适配器

public class PersonAdapter extends BaseMultiItemQuickAdapter<PersonEntity, BaseViewHolder> {

    //构造绑定type和布局的关系
    public PersonAdapter(List<PersonEntity> data) {
        super(data);
        addItemType(0, R.layout.item_title);
        addItemType(1, R.layout.item_name);

    }
    //根据不同的type加载不同的数据
    @Override
    protected void convert(BaseViewHolder helper, PersonEntity item) {
        switch (helper.getItemViewType()){
            case 0://title
                helper.setText(R.id.tv_title,item.getTitle()+"");
                break;
            case 1://name
                helper.setText(R.id.tv_name,item.getName()+"");
                break;
        }
    }
}

主页面
左侧

recyclerView = findViewById(R.id.rv);
        list = new ArrayList<>();
        personAdapter = new PersonAdapter(list);
        recyclerView.setAdapter(personAdapter);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

for(int i = 'A';i<='Z';i++){
            char c = (char) i;
            String title = c+"";//A-Z
            list.add(new PersonEntity(0,"",title));//A
            list.add(new PersonEntity(1,title+"1",title));//A1
            list.add(new PersonEntity(1,title+"2",title));//A2
            list.add(new PersonEntity(1,title+"3",title));//A3
            list_right.add(title);
        }

        personAdapter.notifyDataSetChanged();
        
右侧适配器
public class RightAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
    public int select_position = -1;//选中的下标


    public RightAdapter(int layoutResId, @Nullable List<String> data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, String item) {
        helper.setText(R.id.tv,item+"");
        TextView textView = helper.getView(R.id.tv);
        //修改对应的颜色
        final int position = helper.getAdapterPosition();
        if(position == select_position){
            helper.setTextColor(R.id.tv, Color.WHITE);
            textView.setBackground(mContext.getResources().getDrawable(R.drawable.shape));
        }else{
            helper.setTextColor(R.id.tv, Color.BLACK);
            textView.setBackground(null);
        }



    }
}

右侧

 rv_right = findViewById(R.id.rv_right);
        list_right = new ArrayList<>();
        rightAdapter = new RightAdapter(R.layout.item_right,list_right);
        rv_right.setAdapter(rightAdapter);
        rv_right.setLayoutManager(new LinearLayoutManager(this));

相互交互的逻辑
 //点击右侧:单选效果+左侧滚动到指定的位置
        rightAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                //单选效果
                rightAdapter.select_position = position;
                rightAdapter.notifyDataSetChanged();
                //左侧滚动到指定的位置
                String s = list_right.get(position);//"F"
                for (int i = 0; i < list.size(); i++) {//从左侧集合中找"F"的下标
                    String title = list.get(i).getTitle();
                    int type = list.get(i).getType();
                    if(title.equals(s)&&type==0){//i就是下标,让列表滚动到i这个位置
                        linearLayoutManager.scrollToPositionWithOffset(i,0);
                    }
                }
            }
        });

        //滑动左侧,右边改变
        recyclerView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                //获得左侧当前显示第一个条目的下标的title
                int position = linearLayoutManager.findFirstVisibleItemPosition();
                String title = list.get(position).getTitle();
                //去右边集合查找
                for (int i = 0; i < list_right.size(); i++) {
                    String s = list_right.get(i);
                    if(s.equals(title)){//i坐标找到
                        rightAdapter.select_position = i;
                        rightAdapter.notifyDataSetChanged();
                    }
                }


            }
        });

//删除动画

package com.example.day09_itme;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import com.alibaba.fastjson.JSON;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;

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

public class MainActivity extends AppCompatActivity {
    private RecyclerView rv;
    List<MeiziBean.DataBean> alist=new ArrayList<>();
    MeiziAdap meiziAdap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rv = (RecyclerView) findViewById(R.id.rv);
        DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
        defaultItemAnimator.setMoveDuration(3000);
        defaultItemAnimator.setRemoveDuration(3000);
        defaultItemAnimator.setAddDuration(3000);
        defaultItemAnimator.setChangeDuration(3000);
        rv.setItemAnimator(defaultItemAnimator);
        rv.setLayoutManager(new LinearLayoutManager(this));
        meiziAdap=new MeiziAdap(R.layout.itemshow,alist);
        rv.setAdapter(meiziAdap);
        getokgo();
        getAnima();

    }

    private void getAnima() {
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
            @Override
            public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
                return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
                //return 0;

            }

            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                int position = viewHolder.getAdapterPosition();
                int position1 = target.getAdapterPosition();
                Collections.swap(alist, position, position1);
                meiziAdap.notifyItemMoved(position, position1);
                return true;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                int position = viewHolder.getAdapterPosition();
                alist.remove(position);
                meiziAdap.notifyItemRemoved(position);
            }
        });
        itemTouchHelper.attachToRecyclerView(rv);


    }

    private void getokgo() {
        OkGo.<String>get("https://gank.io/api/v2/data/category/Girl/type/Girl/page/1/count/10")
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        String body = response.body();
                        List<MeiziBean.DataBean> data = JSON.parseObject(body, MeiziBean.class).getData();
                        alist.addAll(data);
                        meiziAdap.notifyDataSetChanged();
                    }
                });
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值