万能适配器+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();
}
});
}
}