我为recycler创建了一个适配器类,用于在recyclerview中填充cardview布局。它工作正常,但当我点击recyclerview中的cardView项目时,我需要获得该cardview项目的位置,基于我需要编写一个Intent活动。以及当我从左向右滑动时如何删除该cardview项目。
MyAdapter
上课。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private NavigationItem[] navigationItem;
private Context mContext;
public MyAdapter(NavigationItem[] navigationItem) {
this.navigationItem = navigationItem;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.navigation_row_cardview, null);
ViewHolder viewHolder = new ViewHolder(itemLayoutView);
return viewHolder;
}
@Override
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
holder.txtViewTitle.setText(navigationItem[position].getTitle());
}
@Override
public int getItemCount() {
return navigationItem.length;
}
public class ViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.hambergerRecyclerView)
public RelativeLayout recyclerView;
public TextView txtViewTitle;
public ViewHolder(final View itemLayoutView) {
super(itemLayoutView);
ButterKnife.inject(this, itemLayoutView);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.navigationItemOptionName);
itemLayoutView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// int itemPosition = RecyclerView.getChildPosition(view);
int itemPosition = recyclerView.getChildAdapterPosition(view);
String item = navigationItem.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
});
}
}
}
答案 0 :(得分:15)
获取CardView项目的位置
当我点击recyclerview中的cardView项目时,我需要获得位置 那个cardview项目
在适配器的onBindViewHolder方法中使用 setTag(),在OnClickListener实现中使用 getTag()。
您也可以使用getAdapterPosition() - 请参阅https://stackoverflow.com/a/27886776/4658957
编辑:如评论中所述,如果您需要实施滑动,请使用getAdapterPosition()方法 - 这样可以确保位置不会关闭。
启动活动
基于我需要编写一个Intent活动
在OnClickListener实现中创建并启动一个新的Intent
Intent newIntent = new Intent(this, YourNewActivity.class);
startActivity(newIntent);
当我点击recyclerview中的cardView项目时,我需要获得位置 那个cardview项目
我使用了View的 setTag()和 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设置为/从中获取位置的视图。
private class myViewHolder extends RecyclerView.ViewHolder {
public View mView;
public myViewHolder(View view) {
super(view);
mView = view;
}
}
在前一种情况下,我将mView设置为父视图。
如果要从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的位置:我们有两种方法(在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 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()方法的密钥,如果你为每个View设置了几个标签,你可以这样做。
基于我需要编写一个Intent活动
要根据用户点击的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。
参考文献:StackOverflow | Tuts+
答案 1 :(得分:2)
在onBindViewHolder
中实施
(id=1, flagged=1)
(id=1, flagged=0)
(id=1, flagged=0)
,然后您将获得排名。
答案 2 :(得分:2)
像这样更新你的观众
public class ViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.hambergerRecyclerView)
public RelativeLayout recyclerView;
public TextView txtViewTitle;
public ViewHolder(final View itemLayoutView) {
super(itemLayoutView);
ButterKnife.inject(this, itemLayoutView);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.navigationItemOptionName);
itemLayoutView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//int itemPosition = RecyclerView.getChildPosition(view);
int itemPosition=getAdapterPosition();
String item = navigationItem.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
});
}
}
答案 3 :(得分:1)
您可以尝试将位置从ViewHolder
onBindViewHolder
@Override
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
holder.txtViewTitle.setText(navigationItem[position].getTitle());
//set position to holder
holder.position = position;
}
public class ViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.hambergerRecyclerView)
public RelativeLayout recyclerView;
public TextView txtViewTitle;
//have a position field in view holder
public int position;
public ViewHolder(final View itemLayoutView) {
super(itemLayoutView);
ButterKnife.inject(this, itemLayoutView);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.navigationItemOptionName);
itemLayoutView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// int itemPosition = RecyclerView.getChildPosition(view);
int itemPosition = position;
String item = navigationItem.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
});
}
}
答案 4 :(得分:0)
在适配器中的onBindViewHolder
myViewHolder1.itemView.setTag(new Integer(position));
并在OnClickListener
Integer pos;
pos = (Integer) view.getTag();