gpt4 book ai didi

android - 如何获取cardView item在recyclerView中的位置?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:49 26 4
gpt4 key购买 nike

我为回收器创建了一个适配器类,用于在回收器 View 中填充卡片 View 布局。它工作正常,但是当我在 recyclerview 中单击 cardView 项目时,我需要获取该 cardview 项目的位置,基于此我需要编写一个 Intent Activity 。以及当我从左向右滑动时如何删除该 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();
}
});
}
}
}

最佳答案

简答

  1. 获取CardView项目的位置

    when i click cardView item in recyclerview i need to get position of that cardview item

    在适配器的 onBindViewHolder 方法中使用 setTag(),在 OnClickListener 实现中使用 getTag()

    您还可以使用 getAdapterPosition() - 参见 https://stackoverflow.com/a/27886776/4658957

    编辑:如评论中所述,如果您需要实现滑动,请改用 getAdapterPosition() 方法 - 这可确保位置不偏离。

  2. 启动 Activity

    based on that i need to write a Intent activity

    在您的 OnClickListener 实现中创建并启动一个新的 Intent

    Intent newIntent = new Intent(this, YourNewActivity.class);    
    startActivity(newIntent);

长答案

如何获取CardView项在RecyclerView列表中的位置?

when i click cardView item in recyclerview i need to get position of that cardview item

我使用了 View 的 setTag()getTag() 方法。 您还可以使用 getAdapterPosition - 请参阅 https://stackoverflow.com/a/27886776/4658957

View 可以是 TextView、ImageView、CardView,甚至是一个 View(可以包含 TextView 、 ImageView 等)- 如果它继承自 View 对象,基本上就可以了。

  • 首先,看看下面的 onCreateViewHolder 方法。 layoutInflater 膨胀我的 XML 布局文件 item_view.xml 中的 View 。该布局文件中的任何 View 都可以在构造函数中访问。

    @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 ——定义另一个常量,使用 view.findViewbyId() 设置它并且不要忘记转换 View (见下文)。

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

    在 CardView android:onClick="positionAction"

    的 XML 布局中设置 onClick 属性
    <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>

    并在包含回收器 View 的 Activity 中创建一个方法。

    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 设置多个标签,您可以这样做。

如何根据点击的CardView启动一个activity?

based on that i need to write a Intent activity

要根据用户点击的 CardView 项目启动新 Activity ,请在 onClick 方法或 positionAction 方法(基于您选择使用的方法)中添加以下两行。

Intent newIntent = new Intent(this, YourNewActivity.class);    
startActivity(newIntent);

如果你想将一个对象从一个 Activity 传递到另一个 Activity ,使用

Intent newIntent = new Intent(this, YourNewActivity.class);
newIntent.putExtra("Item Object", itemList.get(position));
startActivity(newIntent);

并在新 Activity (YourNewActivity 类)中:

itemReceived = new Item();
itemReceived = (Item) getIntent().getSerializableExtra("Item Object");

其中 itemList 是 Item() 对象的 ArrayList。

引用文献:StackOverflow | Tuts+

关于android - 如何获取cardView item在recyclerView中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32473804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com