zoukankan      html  css  js  c++  java
  • Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果。当然,在新能方便也做了大大的提高。本篇 第四十六话 案例,就使用这个控件,完成竖向和横向加载数据。

    我们直接上代码,在每一步后都简要分析一下功能:

    一、实现竖向滚动

    1、定义一个实体类:

    package com.itydl.recyclerview;
    
    public class Fruit {
    
       private String name;
    
       private int imageId;
    
       public Fruit(String name, int imageId) {
          this.name = name;
          this.imageId = imageId;
       }
    
       public String getName() {
          return name;
       }
    
       public int getImageId() {
          return imageId;
       }
    
    }
    

    2、需要为RecyclerView的子项制定一个自定义的布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  >
    
        <ImageView
            android:id="@+id/fruit_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
        <TextView
            android:id="@+id/fruit_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginTop="10dip"/>
    
    </LinearLayout>
    一个用于显示图片,一个用于显示文本。

    3、定义适配器:

    public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
    
    
        private List<Fruit> mFruitList = new ArrayList<Fruit>();
    
        static class ViewHolder extends RecyclerView.ViewHolder {
    
            ImageView mMImageView;
            TextView mTextView;
    
            public ViewHolder(View itemView) {
                super(itemView);
                mMImageView =  (ImageView) itemView.findViewById(R.id.fruit_image);
                mTextView = (TextView) itemView.findViewById(R.id.fruit_name);
            }
        }
    
        public FruitAdapter(List<Fruit> fruitList) {
            mFruitList = fruitList;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = View.inflate(parent.getContext(), R.layout.fruit_item, null);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(FruitAdapter.ViewHolder holder, int position) {
            Fruit fruit = mFruitList.get(position);
            holder.mMImageView.setImageResource(fruit.getImageId());
            holder.mTextView.setText(fruit.getName());
        }
    
        @Override
        public int getItemCount() {
            return mFruitList.size();
        }
    }
    
    这个是与ListView与众不同的地方,要着重说明一下。您会发现,用起来真实太爽了,封装的是如此之好用!

    首选定义一个内部类ViewHolder,它继承自RecycleView.ViewHolder。然后,ViewHolder的构造方法中要传入一个View参数,这个参数通常是RecyclerView子项的最外层布局,那么我们就可以通过findviewById方法来获取到布局中的控件实例。

    接着往下看,FruitAdapter构造,一般用于获取数据源。

    继续往下看,三个方法,依次说明。1、用于创建ViewHolder实例的;2、用于对RecyclerView子项的控件赋值;3、用于返回我RecyclerView会显示多少条数据。

    4、咱们再来看看主活动中的代码:

    public class MainActivity extends AppCompatActivity {
    
        private List<Fruit> fruitList = new ArrayList<Fruit>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initFruits();
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle_view);
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);
            FruitAdapter adapter = new FruitAdapter(fruitList);
            recyclerView.setAdapter(adapter);
        }
    
        private void initFruits() {
            for (int i = 0; i < 2; i++) {
                Fruit apple = new Fruit("Apple", R.drawable.apple_pic);
                fruitList.add(apple);
                Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
                fruitList.add(banana);
                Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
                fruitList.add(orange);
                Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
                fruitList.add(watermelon);
                Fruit pear = new Fruit("Pear", R.drawable.pear_pic);
                fruitList.add(pear);
                Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
                fruitList.add(grape);
                Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
                fruitList.add(pineapple);
                Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
                fruitList.add(strawberry);
                Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
                fruitList.add(cherry);
                Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
                fruitList.add(mango);
            }
        }
    }
    
    这个没什么可说的,需要注意两行代码:

    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    一个是创建LinearLayoutManager,表示线性布局管理器,默认方向是垂直布局;并把这个管理器设置给RecyclerView,这样就相当于设置RecyclerView为竖直滚动。



    二、实现横向滚动布局:

    实现了竖向滚动,横向滚动就手到擒来啦。

    只需要简单的修改代码:

    子项布局文件修改为下面代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="100dp"
                  android:layout_height="match_parent"
                  android:orientation="vertical"
                  >
    
        <ImageView
            android:layout_gravity="center_horizontal"
            android:id="@+id/fruit_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
        <TextView
            android:id="@+id/fruit_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dip"/>
    
    </LinearLayout>

    在主活动中,修改一下线性布局管理器的方向,添加如下代码

    layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

    运行效果如下:



    看起来还是蛮不错的哦~



    喜欢我的朋友可以关注我。或者微信搜索公众号  Android程序员开发指南  每日一阅一篇安卓文章,每天上下班时间打开公众号看看文章,给您增添一些乐趣。

  • 相关阅读:
    [Swift]LeetCode380. 常数时间插入、删除和获取随机元素 | Insert Delete GetRandom O(1)
    [Swift]LeetCode378. 有序矩阵中第K小的元素 | Kth Smallest Element in a Sorted Matrix
    说说心声------ 一些经历
    安装eclipse maven插件m2eclipse No repository found containing
    苹果浏览器实战(三)
    CSDN挑战编程——《绝对值最小》
    高可用技术工具包 High Availability Toolkit
    jstl 标签 循环 序号
    坚向的ViewPager,上下滑动的组件,android上下滑动 VerticalPager
    Php socket数据编码
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299479.html
Copyright © 2011-2022 走看看