2017-12-14 26 views
0

ここpoint_of_sale_list_item.xmlxmlに2つの変数をバインドすることはできますか?ここで

<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>  
     <variable 
      name="item" 
      type="com.myproject.android.customer.api.model.Merchant" /> 
    </data> 

    <android.support.constraint.ConstraintLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/imageViewPhoto" 
      android:layout_width="90dp" 
      android:layout_height="90dp"/> 

     <TextView 
      android:id="@+id/phoneTextView" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content"/> 

    </android.support.constraint.ConstraintLayout> 

</layout> 

ルートアダプタ:

public abstract class PreviewSortAdapter extends RealmRecyclerViewAdapter { 

    public PreviewSortAdapter(Context context, @Nullable OrderedRealmCollection data, boolean autoUpdate) { 
     super(data, true); 
     setHasStableIds(true); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 
     ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, viewType, parent, false); 
     setClickHandler(binding); 
     return new PreviewBaseViewHolder(binding); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     Object obj = getItem(position); 
     PreviewBaseViewHolder previewViewHolder = (PreviewBaseViewHolder) holder; 
     ViewDataBinding viewDataBinding = previewViewHolder.getBinding(); 
     viewDataBinding.setVariable(BR.item, obj); 
     viewDataBinding.executePendingBindings(); //binding must be executed immediately 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return getLayoutForPosition(position); 
    } 

    protected abstract int getLayoutForPosition(int position); 

    private class PreviewBaseViewHolder extends RecyclerView.ViewHolder { 

     private final ViewDataBinding binding; 

     private PreviewBaseViewHolder(ViewDataBinding binding) { 
      super(binding.getRoot()); 
      this.binding = binding; 
     } 

     private ViewDataBinding getBinding() { 
      return binding; 
     } 
    } 

} 

私は、変数をバインドする方法setVariable()を使用して "項目" モデルと。

そして、ここで具体的な子アダプタ:

OK point_of_sale_list_item:

public class MapListSortAdapter extends PreviewSortAdapter { 

    private static final String TAG = MapListSortAdapter.class.getName(); 

    public MapListSortAdapter(Context context, OrderedRealmCollection<Merchant> data) { 
     super(context, data, true); 
    } 

    @Override 
    protected int getLayoutForPosition(int position) { 
     return R.layout.point_of_sale_list_item; 
    } 

} 

このIアダプタでは、私が唯一のレイアウトXMLを指定します。すべて正常に動作します。

しかし、私は別のモデルから設定された電話番号を読む必要があります。 IDでxmlでandroid:[email protected]+id/phoneTextView

だから私はバインドする必要があります変数です。このような 何か:

<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>  
     <variable 
      name="item" 
      type="com.myproject.android.customer.api.model.Merchant" /> 

     <variable 
      name="point" 
      type="com.myproject.android.customer.api.model.PointOfSale" /> 
    </data> 

    <android.support.constraint.ConstraintLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/white"> 

     <ImageView 
      android:id="@+id/imageViewPhoto" 
      android:layout_width="90dp" 
      android:layout_height="90dp" /> 

     <TextView 
      android:id="@+id/phoneTextView" 
      android:layout_width="0dp" 
      android:text="@{point.phone}" 
      android:layout_height="wrap_content" /> 

    </android.support.constraint.ConstraintLayout> 

</layout> 

ここでPOJOコード:

public class PointOfSale { 
    private int id; 
    private String name; 
    private String address; 
    private String phone; 
    private String email; 

    public String getName() { 
     return name; 
    } 

    public String getAddress() { 
     return address; 
    } 
} 

しかし、二vairable(ポイント)が結合していなかったので、もちろん、私は、エラーを取得:

java.lang.IllegalStateException: failed to analyze: android.databinding.tool.util.LoggedErrorException: Found data binding errors. 
****/ data binding error ****msg:Could not find accessor com.myproject.android.customer.api.model.PointOfSale.phone 
file:\myProject\app\src\main\res\layout\point_of_sale_list_item.xml 
loc:61:28 - 61:38 
****\ data binding error **** 

ので、 :

  1. 2つ目のバインディングが可能ですか?
  2. 2番目の変数からデータを取得するにはどうすればよいですか?

この2つのモデルを連結する新しいモデルを作成することはできますか?

答えて

0

私は間違いなくそれをしました。私の場合:

<data> 
    <variable name="viewModel" type="com.todtenkopf.myfrontpage.viewmodel.favoriteteam.FavoriteTeamVM"/> 
    <variable name="matchup" type="com.todtenkopf.myfrontpage.viewmodel.favoriteteam.FavoriteTeamVM.Matchup"/> 

PointOfSaleのコードは表示されません。 phoneは公開フィールドですか、getPhoneアクセサリーを持っていますか?問題はそのような線に沿っているような音です。

+0

あなたは 'PointOfSale'にsetter/getterメソッドがあるとすれば、xmlに2つの変数を使うことができますか? – Alex

+0

いいえ、問題は2つの変数とは関係がない可能性があると私は言っています。私は問題なく2つの変数を使用しました。私は 'phone'がパブリックフィールドでないか、または' getPhone'ゲッターが公開されていないため、あなたが見ていたエラーが起こっていると推測していました。おそらくあなたは 'PointOfSale'コードを投稿できますか? –

+0

私の投稿を更新します。 – Alex

関連する問題