Android recyclerView数据绑定适配器数据
问题描述:
我正在使用Android Data Binding
实施Recycler View
及其各自的adapter
。问题是,在我见过的所有教程,它们初始化适配的数据与Collection
View model
的一类,像这样:Android recyclerView数据绑定适配器数据
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements View.OnClickListener {
private ArrayList<ViewModel> items;
public RecyclerViewAdapter(ArrayList<ViewModel> items) {
this.items = items;
}
.....
}
但我想传递给Recycler View
数据是一个Collection
records
从我database
:
private ArrayList<Record> items;
我怎样才能做到这一点?
在此先感谢!
编辑
li_item.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="report"
type="viewmodel.ReportVM"/>
</data>
....
<TextView
android:id="@+id/tv_report_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:textSize="18sp"
android:paddingBottom="6dp"
android:text="@{report.name}"
tools:text="Report 1"
/>
....
ADAPTER
public class ReportRVAdapter extends RecyclerView.Adapter<ReportRVAdapter.ReportViewHolder> {
private List<ReportDb> data;
public ReportRVAdapter(final List<ReportDb> reportData) {
this.data = reportData;
}
@Override
public ReportRVAdapter.ReportViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.li_item, parent, false);
return new ReportViewHolder(v);
}
@Override
public void onBindViewHolder(final ReportViewHolder holder, final int position) {
ReportDb item = data.get(position);
holder.getBinding().setVariable(BR.name, item.getName());
holder.getBinding().setVariable(BR.contractor, item.getContractor());
//make binding happen immediately
holder.getBinding().executePendingBindings();
}
@Override
public int getItemCount() {
return data == null ? 0 : data.size();
}
public class ReportViewHolder extends RecyclerView.ViewHolder {
private ViewDataBinding binding;
public ReportViewHolder(final View rowView) {
super(rowView);
binding = DataBindingUtil.bind(rowView);
}
public ViewDataBinding getBinding() {
return binding;
}
}
}
模型视图
public class ReportVM extends BaseObservable {
public String name;
public String contractor;
public ReportVM() {
}
@Bindable
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
@Bindable
public String getContractor() {
return contractor;
}
public void setContractor(final String contractor) {
this.contractor = contractor;
}
}
答
您可以在RecyclerView中使用任何集合,它取决于您如何将值与View(TextView,ImageView)绑定在一起。 例子: -
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
final String name = mDataset.get(position);
holder.txtHeader.setText(mDataset.get(position));
}
在上面的例子中
,这取决于你,如果你使用的地图,那么你需要使用密钥来获得价值。对于设置相同的get方法可以使用。
答
最后我没有意识到,而不是:
holder.getBinding().setVariable(BR.name, item.getName());
holder.getBinding().setVariable(BR.contractor, item.getContractor());
//make binding happen immediately
holder.getBinding().executePendingBindings();
我应该这样写:
holder.getBinding().setReport(new ReportVM(item));
和我的POJO:
private ReportDb report;
public ReportVM(final ReportDb report) {
this.report = report;
}
public String getName() {
return report.getName();
}
public String getContractor() {
return report.getContractor();
}
你怎么从你的'记录缩回数据'? –
我对数据库做了一个查询 – IrApp
在'onBindViewHolder'内执行它并不高效,所以你应该预先从数据库读取数据到mdoel我认为 –