Android - RecyclerView

0. 效果

在这里插入图片描述

1. 添加绑定设置

如上一篇文章(Android - DataBinding)一样,在 build.gradle 中添加

buildFeatures{
    dataBinding true
}

2. 添加数据类

添加数据类 Book.java

public class Book {
    public String bookName;
    public String bookAuthor;
    public String bookImage;

    public Book(String bookName, String bookAuthor, String bookImage) {
        this.bookName = bookName;
        this.bookAuthor = bookAuthor;
        this.bookImage = bookImage;
    }
}

3. 添加RecyclerView控件及其Item

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

recycler_view_item.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="book"
            type="com.example.recyclerview.Book" />
    </data>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="5dp">

        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:scaleType="centerCrop"
            tools:src="@tools:sample/avatars"
            app:itemImage="@{book.bookImage}"/>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:textSize="24sp"
                tools:text="书名"
                android:text="@{book.bookName}"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:gravity="center_vertical"
                tools:text="作者"
                android:text="@{book.bookAuthor}"/>

        </LinearLayout>

    </LinearLayout>
</layout>

4. 添加RecyclerView的Adapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    List<Book> bookList;

    public RecyclerViewAdapter(List<Book> bookList) {
        this.bookList = bookList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        RecyclerViewItemBinding recyclerViewItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.recycler_view_item, parent, false);
        return new MyViewHolder(recyclerViewItemBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.recyclerViewItemBinding.setBook(bookList.get(position));
    }

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

    static class MyViewHolder extends RecyclerView.ViewHolder{

        private RecyclerViewItemBinding recyclerViewItemBinding;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
        }

        public MyViewHolder(RecyclerViewItemBinding recyclerViewItemBinding) {
            super(recyclerViewItemBinding.getRoot());
            this.recyclerViewItemBinding = recyclerViewItemBinding;
        }
    }
}

5. ImageView的Adapter

public class ImageViewBindingAdapter {
    @BindingAdapter("itemImage")
    public static void setImage(ImageView imageView, String url){
        if (!TextUtils.isEmpty(url)){
            Picasso.get()
                    .load(url)
                    .placeholder(R.drawable.ic_launcher_background)
                    .into(imageView);
        }
        else {
            imageView.setBackgroundColor(Color.GRAY);
        }
    }
}

ImageView的绑定:

  • 如果是本地资源可以不写这个Adapter,参照:Android - DataBinding里面的第3节写的方法绑定,使用app:imageResource;
  • 如果是网络资源,如这一小节写的写个Adapter,具体说明参考Android官网文档:绑定适配器

6. MainActivity中添加绑定

public class MainActivity extends AppCompatActivity {

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

        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        activityMainBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));

        List<Book> bookList = BookUtils.get();
        activityMainBinding.recyclerView.setAdapter(new RecyclerViewAdapter(bookList));
    }
}

其中,BookUtils代码:

public class BookUtils {
    public static List<Book> get(){
        List<Book> bookList = new ArrayList<>();

        Book book1 = new Book("浪潮之巅", "吴军", "https://img9.doubanio.com/view/subject/l/public/s6807265.jpg");
        bookList.add(book1);

        Book book2 = new Book("从0到1", "蒂尔、马斯特斯", "https://img9.doubanio.com/view/subject/l/public/s28299265.jpg");
        bookList.add(book2);

        Book book3 = new Book("硅谷钢铁侠", "阿什利·万斯", "https://img9.doubanio.com/view/subject/l/public/s28571694.jpg");
        bookList.add(book3);

        Book book4 = new Book("重构:改善既有代码的设计", "Martin Fowler", "https://img2.doubanio.com/view/subject/l/public/s30014452.jpg");
        bookList.add(book4);

        Book book5 = new Book("代码整洁之道", "Robert C. Martin", "https://img2.doubanio.com/view/subject/l/public/s4103991.jpg");
        bookList.add(book5);

        Book book6 = new Book("代码大全", "史蒂夫·迈克康奈尔", "https://img1.doubanio.com/view/subject/l/public/s1495029.jpg");
        bookList.add(book6);

        return bookList;
    }
}



关于RecyclerView更详细的说明,见Android官方文档:

7. 示例代码

https://gitee.com/jie-xio/android_samples/tree/master/RecyclerView

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值