2016-09-13 7 views
1

私はViewPagerをアンドロイドデータバインディングを使用して実装しました。データとクリックイベントで完璧に動作しています。私はここでは、クリックイベントデータバインディングを使用したViewPagerアイテムの位置

public interface ItemClickListener { 
    public void onItemClick(); 
} 

ためinterfaceを作成している

は、私は、アダプタのコンストラクタでitemClickListenerを送っていますPagerAdapter

@Override 
public Object instantiateItem(ViewGroup container, final int position) { 
    ListItemBinding binding = DataBindingUtil.inflate(mLayoutInflater, R.layout.list_item, container, false); 
    binding.setHandler(itemClickListener); 
    binding.getRoot().setTag(position); 
    container.addView(binding.getRoot()); 
    return binding.getRoot(); 
} 

の私のinstantiateItem()です。ここで

public MatchListAdapter(Context context, ItemClickListener itemClickListener) { 
    mContext = context; 
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.itemClickListener= itemClickListener; 
} 

は私list_item.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <data> 
     <variable 
      name="handler" 
      type="com.example.ItemClickListener" /> 
    </data> 

    <LinearLayout 
     android:id="@+id/root_viewItem" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:onClick="@{() -> handler.onItemClick()}" 
     android:orientation="vertical"> 

     //rest views and controls. 

    </LinearLayout> 
</layout> 

ある今の問題は、XMLから、その位置を渡す方法を、私がクリックした項目の位置を通過したいということでしょうか?私はxmlから自分のメソッドを呼び出して位置を渡す方法は?

答えて

3

あなたはすでに

binding.getRoot().setTag(position); 

をやっているタグで設定した位置よりもインターフェース

public interface ItemClickListener { 
    public void onItemClick(View view); 
    } 

にビューを渡すことができますが、この

@Override 
public void onItemClick(View view){ 
    int position=(int)view.getTag(); 
} 
のように、そのビューのPARAMから位置を取得することができるより

詳細については、http://developers-club.com/posts/267735/

を参照してください。
+0

からの位置の値を設定します私の意見xml? –

+0

'DataBinding'は、xmlのビューパラメータを渡す必要がないことを処理します。 –

+0

ありがとう、それは動作します:) –

1

あなたはこのように、ラムダ式のパラメータを渡すことができます。

android:onClick="@{() -> handler.onItemClick(rootItemView.getTag().toString())}" 

そしてもちろん、あなたのインターフェイスメソッドとその実装を編集する必要があります:

public void onItemClick(String data); 
+0

ありがとう、それはまた有用であり、うまく動作します:) –

1

どちらの答えは私を助けました両方とも動作していますが、私は別のやり方も見つけましたが、少し長いです。

私はlist_item.xmlにもう一度Integer変数をとり、アダプタからその値を設定しました。

<data> 
    <variable 
     name="position" 
     type="Integer"/> 
</data> 

は、その後インターフェイスがこの

public interface ItemClickListener { 
    public void onItemClick(int position); 
} 

のようになります。

android:onClick="@{() -> handler.onItemClick(position)}" 
onItemClickでそれを渡して私が取得できますか instantiateItem()

@Override 
public Object instantiateItem(ViewGroup container, final int position) { 
    ListItemBinding binding = DataBindingUtil.inflate(mLayoutInflater, R.layout.list_item, container, false); 
    binding.setHandler(itemClickListener); 
    binding.setPosition(position); 
    binding.getRoot().setTag(position); 
    container.addView(binding.getRoot()); 
    return binding.getRoot(); 
} 
+0

私の答えはより信頼性が高く複雑ではないと思います。 –

+0

@BurhanuddinRashidはい私は知っている、それはなぜ私は私の答えは少し長いです書いた –

+0

あなたは答えとして受け入れられるべきではないと思いますか? –

関連する問題