您的位置:

Android RecycleView使用详解

一、Android RecyclerView

Android RecyclerView是ListView的升级版,但在很多方面都比ListView更加灵活和强大。RecyclerView通常被用于大型数据集的动态UI效果。与ListView相比,RecyclerView有以下优势:

1、可扩展性:RecyclerView支持自定义布局管理器和分隔符,Listview无法实现这一点。
2、使用强大:RecyclerView适用于大型数据集,可以通过定义ViewHolder支持大数据集来提高性能。
3、单项动画: 在RecyclerView中,可以单独设置一项的动画,而在ListView中,必须将所有项均设置动画,开发者无法自主设置单独一项的动画效果。
4、内存消耗少:RecyclerView内存消耗小于ListView的原因是RecyclerView只存在有限数量的子视图,而ListView却需要全部加载。

二、Android RecyclerView加载网络数据

Android RecyclerView可以很方便地加载网络数据,开发者通常需要完成以下任务:
1、定义RecyclerView的布局。
2、实现自定义的Adapter类,并且重写Adapter类的Related方法。
3、在Activity或Fragment中实例化RecyclerView,设置布局管理器,以及设置Adapter类为RecyclerView的参数。

下面是一个例子,使用Retrofit和Picasso框架加载网络数据:

定义RecyclerView的布局

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:scrollbars="vertical"
        app:layoutManager="LinearLayoutManager"
        tools:listitem="@layout/item_layout" />

实现自定义Adapter

    public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {

        private List<Model> modelList;
        private Context context;

        public CustomAdapter(Context context, List<Model> modelList) {
            this.context = context;
            this.modelList = modelList;
        }

        @Override
        public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(context);
            View view = inflater.inflate(R.layout.item_layout, parent, false);
            return new CustomViewHolder(view);
        }

        @Override
        public void onBindViewHolder(CustomViewHolder holder, int position) {
            Model model = modelList.get(position);
            holder.txtName.setText(model.getName());
            Picasso.get().load(model.getImageUrl()).into(holder.imageView);
        }

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

        static class CustomViewHolder extends RecyclerView.ViewHolder {
            TextView txtName;
            ImageView imageView;

            CustomViewHolder(View itemView) {
                super(itemView);
                txtName = itemView.findViewById(R.id.txt_name);
                imageView = itemView.findViewById(R.id.img);
            }
        }
    }

在Activity中实例化RecyclerView

    public class MainActivity extends AppCompatActivity {

        private RecyclerView recyclerView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            recyclerView = findViewById(R.id.recycler_view);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            List<Model> modelList = ApiClient.getModels();
            CustomAdapter adapter = new CustomAdapter(this, modelList);
            recyclerView.setAdapter(adapter);

        }
    }

三、Android RecyclerView倒序排列

RecyclerView倒序排列实质上是为了减少数据量,对于需要展示大量数据的场景非常实用。RecyclerView倒序排列通常可以通过设置RecyclerView的布局管理器LayoutManager来实现:
1、设置LayoutManager为LinearLayoutManager,然后在onResume()函数中直接调用:
2、通过集成LinearLayoutManager,重写scrollToPositionWithOffset()方法,在该方法中使用反转的逻辑。

方式一:设置LayoutManager

    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,true));

方式二:集成LinearLayoutManager

    public class CustomLinearLayoutManager extends LinearLayoutManager {

        public CustomLinearLayoutManager(Context context) {
            super(context);
        }

        public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
            super(context, orientation, reverseLayout);
        }

        @Override
        public void scrollToPositionWithOffset(int position, int offset) {
            super.scrollToPositionWithOffset(getItemCount() - position - 1, offset);
        }
    }

总结

本文详细介绍了Android RecyclerView的优势,如可扩展性,使用灵活,动态UI效果等。并且详细阐述了RecyclerView如何加载网络数据,包括定义RecyclerView的布局、实现自定义的Adapter类以及在Activity或Fragment中实例化RecyclerView,设置布局管理器以及设置Adapter类为RecyclerView的参数。最后,本文还详细介绍了RecyclerView倒序排列的两种方式。