具有数据绑定的 ViewPager 项的位置
position of ViewPager item with Data Binding
我已经使用 android 数据绑定实现了 ViewPager
,它与数据和点击事件完美结合。
我已经为点击事件创建了interface
public interface ItemClickListener {
public void onItemClick();
}
这是我的 instantiateItem()
的 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();
}
我在适配器构造函数中发送 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 调用我的方法如何传递位置?
可以通过界面查看
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/
你可以在 lambda 表达式中传递参数,像这样:
android:onClick="@{() -> handler.onItemClick(rootItemView.getTag().toString())}"
当然,您需要编辑接口方法及其实现:
public void onItemClick(String data);
两个答案都对我有帮助,而且都有效,我也找到了另一种方法,但是有点冗长。
我在 list_item.xml
中又获取了一个 Integer
变量,并从适配器设置了它的值。
<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();
}
我已经使用 android 数据绑定实现了 ViewPager
,它与数据和点击事件完美结合。
我已经为点击事件创建了interface
public interface ItemClickListener {
public void onItemClick();
}
这是我的 instantiateItem()
的 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();
}
我在适配器构造函数中发送 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 调用我的方法如何传递位置?
可以通过界面查看
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/
你可以在 lambda 表达式中传递参数,像这样:
android:onClick="@{() -> handler.onItemClick(rootItemView.getTag().toString())}"
当然,您需要编辑接口方法及其实现:
public void onItemClick(String data);
两个答案都对我有帮助,而且都有效,我也找到了另一种方法,但是有点冗长。
我在 list_item.xml
中又获取了一个 Integer
变量,并从适配器设置了它的值。
<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();
}