4 android swipe recycler-adapter android-recyclerview
我为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();
}
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
bas*_*ien 15
获取CardView项目的位置
当我点击recyclerview中的cardView项目时,我需要获得该cardview项目的位置
在适配器的onBindViewHolder方法中使用setTag(),在OnClickListener实现中使用getTag().
你也可以使用getAdapterPosition() - 参见/sf/answers/1952074351/
编辑:如评论中所述,如果您需要实现滑动,请使用getAdapterPosition()方法 - 这可确保位置不会关闭.
发起一项活动
基于我需要编写一个Intent活动
在OnClickListener实现中创建并启动一个新的Intent
Intent newIntent = new Intent(this, YourNewActivity.class);
startActivity(newIntent);
Run Code Online (Sandbox Code Playgroud)当我点击recyclerview中的cardView项目时,我需要获得该cardview项目的位置
我使用了View 的setTag()和getTag()方法.您也可以使用getAdapterPosition - 请参阅/sf/answers/1952074351/
视图可以是TextView,ImageView,CardView,甚至是视图(可以包含文本视图,图像视图等) - 如果它继承自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);
}
Run Code Online (Sandbox Code Playgroud)为View对象定义一个常量,例如mView,并将其设置为您希望将onClickListener设置为/从中获取位置的视图.
private class myViewHolder extends RecyclerView.ViewHolder {
public View mView;
public myViewHolder(View view) {
super(view);
mView = view;
}
}
Run Code Online (Sandbox Code Playgroud)
在前一种情况下,我将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);
}
}
Run Code Online (Sandbox Code Playgroud)在适配器类的onBindViewHolder方法中使用setTag().现在,每个CardView都在RecyclerView列表中作为标记位置.
@Override
public void onBindViewHolder(myViewHolder viewHolder, int position) {
viewHolder.mCardView.setTag(position);
}
Run Code Online (Sandbox Code Playgroud)使用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();
}
Run Code Online (Sandbox Code Playgroud)
或者在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>
Run Code Online (Sandbox Code Playgroud)
并在包含回收器视图的活动中创建一个方法.
public void positionAction(View view) {
int position = (int) view.getTag();
Toast.makeText(view.getContext(),Integer.toString(position),Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)对于上面的两个选项,您可以使用String position = "Position " + view.getTag.toString();而不是int position = (int) view.getTag;如果要获取作为String的位置.
注意1:您只能在已调用setTag()方法的View对象上使用getTag(),否则您将获得NullPointerException.
注意2:我没有使用setTag()和getTag()方法的密钥,如果你为每个View设置了几个标签,你可以这样做.
基于我需要编写一个Intent活动
要基于用户单击的CardView项启动新活动,请在onClick方法或positionAction方法中添加以下两行(基于您选择使用的那一行).
Intent newIntent = new Intent(this, YourNewActivity.class);
startActivity(newIntent);
Run Code Online (Sandbox Code Playgroud)
如果要将对象从一个活动传递到另一个活动,请使用
Intent newIntent = new Intent(this, YourNewActivity.class);
newIntent.putExtra("Item Object", itemList.get(position));
startActivity(newIntent);
Run Code Online (Sandbox Code Playgroud)
并在新活动(YourNewActivity类)中:
itemReceived = new Item();
itemReceived = (Item) getIntent().getSerializableExtra("Item Object");
Run Code Online (Sandbox Code Playgroud)
其中itemList是Item()对象的ArrayList.
参考文献: StackOverflow | TUTS +
| 归档时间: |
|
| 查看次数: |
20329 次 |
| 最近记录: |