【问题标题】:Android recyclerView data binding adapter dataAndroid recyclerView 数据绑定适配器数据
【发布时间】:2016-11-11 08:21:38
【问题描述】:

我正在使用Android Data Binding 实现Recycler View 及其各自的adapter。问题是,在我看到的所有教程中,他们使用View model 类的Collection 初始化适配器的数据,如下所示:

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 的数据是来自我的database 的records 的Collection:

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"
        />

....

适配器

    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;
}
}

【问题讨论】:

  • 如何从Record 中收回数据?
  • 我查询数据库
  • 在onBindViewHolder里面做这件事效率不高,所以我认为你应该将数据库中的数据预读到mdoel中

标签: android data-binding android-recyclerview


【解决方案1】:

您可以在 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));
}

在上面的例子中,这取决于你,如果你使用 Map 那么你需要使用 key 来获取 value。对于 set 可以使用相同的 get 方法。

【讨论】:

    【解决方案2】:

    我终于意识到,而不是:

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-27
      • 2017-12-15
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2019-08-19
      相关资源
      最近更新 更多