使用数据绑定获取ViewPager项的位置

6
我使用Android数据绑定实现了ViewPager,它可以完美处理数据和点击事件。我为点击事件创建了interface
public interface ItemClickListener {
    public void onItemClick();
}

这是我的PagerAdapterinstantiateItem()方法:
@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();
}

我在适配器构造函数中发送了itemClickListener
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个回答

5
您可以在接口中传递视图。
 public interface ItemClickListener {
     public void onItemClick(View view);
  }

然后在您已经设置的标签中指定位置。
binding.getRoot().setTag(position);

然后您可以像这样从该视图参数中获取位置
@Override
public void onItemClick(View view){
  int position=(int)view.getTag();
}

有关更详细的信息,请参阅http://developers-club.com/posts/267735/


如何在XML中获取我的视图? - Ravi
DataBinding 会处理视图参数,您不需要从 XML 传递任何视图参数。 - Burhanuddin Rashid

4

这两个答案都对我有帮助,并且它们都有效,我还发现了另一种方式,但稍微有点冗长。

我在我的适配器中添加了一个额外的Integer变量,在list_item.xml中设置其值。

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

并将其传递给onItemClick

android:onClick="@{() -> handler.onItemClick(position)}"

然后界面将会是这样。
public interface ItemClickListener {
    public void onItemClick(int position);
}

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

我认为我的答案更可靠,更简单。 - Burhanuddin Rashid
@BurhanuddinRashid 是的,我知道,这就是为什么我写的答案有点冗长。 - Ravi

2
您可以在lambda表达式中传递参数,如下所示:
android:onClick="@{() -> handler.onItemClick(rootItemView.getTag().toString())}" 

当然,您需要编辑接口方法及其实现:

public void onItemClick(String data);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接