文章目录
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