简答
-
获取CardView项目的位置
当我单击 recyclerview 中的 cardView 项目时,我需要获取的位置
该卡片视图项目
use setTag()在适配器的 onBindViewHolder 方法中getTag()在您的 OnClickListener 实现中。
您还可以使用 getAdapterPosition() - 请参阅https://stackoverflow.com/a/27886776/4658957
EDIT:正如评论中提到的,如果您需要实现滑动,请使用 getAdapterPosition() 方法 - 这可以确保位置不会关闭。
-
发起活动
基于此我需要编写一个意图活动
在 OnClickListener 实现中创建并启动一个新的 Intent
Intent newIntent = new Intent(this, YourNewActivity.class);
startActivity(newIntent);
长答案
如何获取CardView项目在RecyclerView列表中的位置?
当我单击 recyclerview 中的 cardView 项目时,我需要获取的位置
该卡片视图项目
我用的是setTag() and getTag()查看方法。
您还可以使用 getAdapterPosition - 请参阅https://stackoverflow.com/a/27886776/4658957
View 可以是 TextView、ImageView、CardView,甚至是 View(可以包含文本视图、图像视图等)——如果它继承自 View 对象,基本上就可以了。
-
首先看下面的onCreateViewHolder方法。layoutInflater
膨胀我的 XML 布局文件中的视图item_view.xml
。该布局文件中的任何视图都可以在构造函数中访问。
@Override
public myViewHolder onCreateViewHolder(ViewGroup parentViewGroup, int i) {
...
View itemView = layoutInflater.inflate(R.layout.item_view, parentViewGroup, false);
return new myViewHolder(itemView);
}
-
为您的 View 对象定义一个常量(例如 mView),并将其设置为您希望将 onClickListener 设置为/从中获取位置的 View。
private class myViewHolder extends RecyclerView.ViewHolder {
public View mView;
public myViewHolder(View view) {
super(view);
mView = view;
}
}
在前面的例子中,我将mView设置为父View。
如果您想从 onCreateViewHolder 中膨胀的 item_view.xml 布局文件访问特定视图 - 定义另一个常量,使用 view.findViewbyId() 设置它,并且不要忘记强制转换视图(见下文)。
private class myViewHolder extends RecyclerView.ViewHolder {
public CardView mCardView;
public myViewHolder(View view) {
super(view);
mCardView = (CardView) view.findViewById(R.id.card_view);
}
}
-
在适配器类的 onBindViewHolder 方法中使用 setTag() 。现在,每个 CardView 在 RecyclerView 列表中都有其位置作为标签。
@Override
public void onBindViewHolder(myViewHolder viewHolder, int position) {
viewHolder.mCardView.setTag(position);
}
-
使用 getTag() 访问 RecyclerView 列表中每个 CardView 的位置:我们有 2 种方法(在 Activity 中或在 XML 中)。
在 ViewHolder 构造函数中设置 onClickListener (不要忘记实现 View.OnClickListener)并编辑 onClick 方法
private class myViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public View mCardView;
public myViewHolder(View view) {
super(view);
mCardView = (CardView) view.findViewById(R.id.card_view);
mCardView.setOnClickListener(this);
}
}
@Override
public void onClick(View view) {
int position = (int) view.getTag();
Toast.makeText(view.getContext(),Integer.toString(position),Toast.LENGTH_SHORT).show();
}
OR在 CardView 的 XML 布局中设置 onClick 属性android:onClick="positionAction"
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="positionAction">
</android.support.v7.widget.CardView>
并在包含回收器视图的活动中创建一个方法。
public void positionAction(View view) {
int position = (int) view.getTag();
Toast.makeText(view.getContext(),Integer.toString(position),Toast.LENGTH_SHORT).show();
}
对于上面的两个选项,您可以使用String position = "Position " + view.getTag.toString();
代替int position = (int) view.getTag;
如果你想获取字符串形式的位置。
注意1:你只能在调用了setTag()方法的View对象上使用getTag()(否则你将得到一个NullPointerException)。
注 2:我没有为 setTag() 和 getTag() 方法使用键,如果您为每个视图设置多个标签,则可以这样做。
如何根据点击的CardView启动一个Activity?
基于此我需要编写一个意图活动
要根据用户单击的 CardView 项启动一项新活动,请在 onClick 方法或positionAction 方法(根据您选择使用的方法)中添加以下两行。
Intent newIntent = new Intent(this, YourNewActivity.class);
startActivity(newIntent);
如果要将对象从一个活动传递到另一个活动,请使用
Intent newIntent = new Intent(this, YourNewActivity.class);
newIntent.putExtra("Item Object", itemList.get(position));
startActivity(newIntent);
并在新活动(YourNewActivity 类)中:
itemReceived = new Item();
itemReceived = (Item) getIntent().getSerializableExtra("Item Object");
其中 itemList 是 Item() 对象的 ArrayList。
参考:堆栈溢出 | Tuts+