2016-11-11 64 views
0

我正在使用Android Data Binding实施Recycler View及其各自的adapter。问题是,在我见过的所有教程,它们初始化适配的数据与CollectionView 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数据是一个Collectionrecords从我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; 
} 
} 
+0

你怎么从你的'记录缩回数据'? –

+0

我对数据库做了一个查询 – IrApp

+0

在'onBindViewHolder'内执行它并不高效,所以你应该预先从数据库读取数据到mdoel我认为 –

回答

4

您可以在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方法可以使用。

0

最后我没有意识到,而不是:

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