RecyclerView常用方法+代码实现+删除动画错位+接口回调+多布局

本文详细介绍了RecyclerView的使用,包括其布局依赖、优势、方法,如LinearLayoutManager的横向滑动,Adapter的刷新方法。还讨论了删除动画错位问题的解决,接口回调的实现,以及如何处理多布局。提供了代码实现和关键步骤,帮助开发者更好地理解和应用RecyclerView。

RecyclerView

RecyclerView布局依赖:implementation 'com.android.support:recyclerview-v7:28.0.0’

RecyclerView比ListView的优势

  1. RecyclerView比listview实现效果更多
  2. RecycelrView支持多布局;
  3. RecyclerView根据项目需要插拔功能

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代码实现

xml文件中创建该布局

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

    </android.support.v7.widget.RecyclerView>
 RecyclerView recyclerView;
    String url = "https://www.apiopen.top/satinApi?type=1&page=2";
    MyRecylerViewAdapter myRecylerViewAdapter;
    ArrayList<HashMap<String,String>> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.rv);

        OkGo.<String>get(url).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                String s = response.body();

                Gson gson = new Gson();
                JavaBean javaBean = gson.fromJson(s, JavaBean.class);
                List<JavaBean.DataBean> data = javaBean.getData();
                for (int i=0;i<data.size();i++) {
                    HashMap<String,String> map = new HashMap<>();
                    JavaBean.DataBean dataBean = data.get(i);
                    String videouri = dataBean.getVideouri();
                    String text = dataBean.getText();
                    String image0 = dataBean.getImage0();

                    map.put("videouri",videouri);
                    map.put("image0",image0);
                    map.put("text",text);
                    list.add(map);
                }
                myRecylerViewAdapter = new MyRecylerViewAdapter(list,MainActivity.this);
                recyclerView.setAdapter(myRecylerViewAdapter);

                myRecylerViewAdapter.setMyInterface(new MyInterface() {
                    @Override
                    public void OnClickListenner(int porsition) {
                        HashMap<String, String> map = list.get(porsition);
                        Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                        intent.putExtra("path",map.get("videouri"));
                        startActivity(intent);
                    }

                    @Override
                    public void OnLongClickListenner(int porsition) {
                        list.remove(porsition);
                        myRecylerViewAdapter.notifyItemRangeChanged(0,list.size());
                    }
                });
            }
        });

//      删除动画效果
        DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
        defaultItemAnimator.setRemoveDuration(2000);

//      LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//      GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);
    }

删除动画错位

删除的同时将位置从头开始

 		list.remove(porsition);
        myRecylerViewAdapter.notifyItemRangeChanged(0,list.size());

接口回调

  1. 先创建接口
public interface MyInterface {
    void OnClickListenner(int porsition);
    void OnLongClickListenner(int porsition);
}
  1. 适配器中需要回调方法
 myRecylerViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myInterface.OnClickListenner(i);
            }
        });
        myRecylerViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                myInterface.OnLongClickListenner(i);
                return true;
            }
        });
  1. 去完成返回来的方法去实现功能
 myRecylerViewAdapter.setMyInterface(new MyInterface() {
                    @Override
                    public void OnClickListenner(int porsition) {
                        HashMap<String, String> map = list.get(porsition);
                        Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                        intent.putExtra("path",map.get("videouri"));
                        startActivity(intent);
                    }

                    @Override
                    public void OnLongClickListenner(int porsition) {
                        list.remove(porsition);
                        myRecylerViewAdapter.notifyItemRangeChanged(0,list.size());
                    }
                });

多布局

主要在适配器中创建多个ViewHolder类,有几个布局就创建几个

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

    ArrayList<JavaBean> list;
    Context context;

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

    @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(context).inflate(R.layout.title_layout, viewGroup, false);
            return new TitleViewHolder(view);
        }else {
            View view = LayoutInflater.from(context).inflate(R.layout.person_layout,viewGroup,false);
            return new PersonViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        if (getItemViewType(i)==0) {
            TitleViewHolder titleViewHolder = (TitleViewHolder) viewHolder;
            titleViewHolder.textView.setText(list.get(i).getTitle()+"");
        }else {
            PersonViewHolder personViewHolder = (PersonViewHolder) viewHolder;
            personViewHolder.tv_name.setText(list.get(i).getName()+"");
            personViewHolder.tv_number.setText(list.get(i).getNumber()+"");
        }
    }

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

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

    class PersonViewHolder extends RecyclerView.ViewHolder{
        TextView tv_name,tv_number;
        public PersonViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            tv_number = itemView.findViewById(R.id.tv_number);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值