Java 在适配器中保存卡位置

Java 在适配器中保存卡位置,java,android,android-adapter,android-viewholder,Java,Android,Android Adapter,Android Viewholder,我正在尝试将卡的位置传递给SlideView活动,其中使用onMenuItemClick显示有关该特定卡的正确信息。目前,我在onMenuItemClick中使用getAdapterPosition,但这会导致绘制到屏幕的最后一个元素保存到我的adapterPosition中。我理解它为什么给出最后一个位置,但不确定如何设置正确的位置。我是否应该尝试通过showPopupMenu或其他方式保存并传递该职位?下面是我的适配器和Main活动 适配器: public class Adapter ext

我正在尝试将卡的位置传递给SlideView活动,其中使用onMenuItemClick显示有关该特定卡的正确信息。目前,我在onMenuItemClick中使用getAdapterPosition,但这会导致绘制到屏幕的最后一个元素保存到我的adapterPosition中。我理解它为什么给出最后一个位置,但不确定如何设置正确的位置。我是否应该尝试通过showPopupMenu或其他方式保存并传递该职位?下面是我的适配器和Main活动

适配器:

public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
private Context mContext;
private List<Properties> dogList;
private MyViewHolder holder;


public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title, count;
    public ImageView thumbnail, overflow;

    public MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.title);
        count = (TextView) view.findViewById(R.id.count);
        thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
        overflow = (ImageView) view.findViewById(R.id.overflow);

    }
}


public Adapter(Context mContext, List<Properties> dogList) {
    this.mContext = mContext;
    this.dogList = dogList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    this.holder=holder;
    Properties dog = dogList.get(position);
    holder.title.setText(dog.getName());

    // loading dog cover using Glide library
    Glide.with(mContext).load(dog.getThumbnail()).into(holder.thumbnail);

    holder.overflow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showPopupMenu(holder.overflow);
        }
    });
}

/**
 * Showing popup menu when tapping on icon
 */
private void showPopupMenu(View view) {
    // inflate menu
    PopupMenu popup = new PopupMenu(mContext, view);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.menu, popup.getMenu());
    popup.setOnMenuItemClickListener(new MyMenuItemClickListener());
    popup.show();
}

/**
 * Click listener for popup menu items
 */
class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener {

    public MyMenuItemClickListener() {
    }

    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        switch (menuItem.getItemId()) {
            case R.id.action_add_favourite:
                Toast.makeText(mContext, "Add to favourite", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_more_info:
                Intent slideStart = new Intent(mContext, SlideViewActivity.class);

                super.getClass();

                int adapterPosition = holder.getAdapterPosition();
                slideStart.putExtra("position", adapterPosition);

                slideStart.putExtra("list", (Serializable) dogList);

                mContext.startActivity(slideStart);
                return true;
            default:
        }
        return false;
    }
}

@Override
public int getItemCount() {
    return dogList.size();
}
}
公共类适配器扩展了RecyclerView.Adapter{
私有上下文;
私人名单;
私人MyViewHolder;
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图标题、计数;
公共图像视图缩略图,溢出;
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.title);
count=(TextView)view.findViewById(R.id.count);
缩略图=(ImageView)view.findViewById(R.id.缩略图);
溢出=(ImageView)view.findViewById(R.id.overflow);
}
}
公共适配器(上下文mContext、列表dogList){
this.mContext=mContext;
this.dogList=dogList;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext()).flate(R.layout.card,parent,false);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,内部位置){
这个.holder=holder;
属性dog=dogList.get(位置);
holder.title.setText(dog.getName());
//使用Glide库加载狗罩
将(dog.getThumbnail())加载到(holder.thumbnail)中;
holder.overflow.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
showPopupMenu(holder.overflow);
}
});
}
/**
*点击图标时显示弹出菜单
*/
私有void显示弹出菜单(视图){
//充气菜单
PopupMenu popup=新的PopupMenu(mContext,视图);
MenuInflater充气器=弹出窗口。getMenuInflater();
充气器。充气(R.menu.menu,popup.getMenu());
setOnMenuItemClickListener(新的MyMenuItemClickListener());
popup.show();
}
/**
*单击listener以查看弹出菜单项
*/
类MyMenuItemClickListener实现PopupMenu.OnMenuItemClickListener{
公共MyMenuItemClickListener(){
}
@凌驾
公共布尔onMenuItemClick(MenuItem MenuItem){
开关(menuItem.getItemId()){
案例R.id.action\u add\u Favorite:
Toast.makeText(mContext,“添加到收藏夹”,Toast.LENGTH_SHORT.show();
返回true;
案例R.id.action\u更多信息:
意向slideStart=新意向(mContext、SlideViewActivity.class);
super.getClass();
int adapterPosition=holder.getAdapterPosition();
slideStart.putExtra(“位置”,适配器位置);
slideStart.putExtra(“列表”,“可序列化的”狗列表);
mContext.startActivity(slideStart);
返回true;
违约:
}
返回false;
}
}
@凌驾
public int getItemCount(){
返回dogList.size();
}
}
主要活动:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private RecyclerView recyclerView;
private Adapter adapter;
private List<Properties> dogList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    initCollapsingToolbar();

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    dogList = new ArrayList<>();
    adapter = new Adapter(this, dogList);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);

    prepareCards();

    try {
        Glide.with(this).load(R.drawable.austrailian_shepherd).into((ImageView) findViewById(R.id.backdrop));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Initializing collapsing toolbar
 * Will show and hide the toolbar title on scroll
 */
private void initCollapsingToolbar() {
    final CollapsingToolbarLayout collapsingToolbar =
            (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
    collapsingToolbar.setTitle(" ");
    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
    appBarLayout.setExpanded(true);

    // hiding & showing the title when toolbar expanded & collapsed
    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        boolean isShow = false;
        int scrollRange = -1;

        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            if (scrollRange == -1) {
                scrollRange = appBarLayout.getTotalScrollRange();
            }
            if (scrollRange + verticalOffset == 0) {
                collapsingToolbar.setTitle(getString(R.string.app_name));
                isShow = true;
            } else if (isShow) {
                collapsingToolbar.setTitle(" ");
                isShow = false;
            }
        }
    });
}

private void prepareCards() {
    int librarySize = getResources().getStringArray(R.array.titles).length;

    for(int i=0;i<librarySize;i++) {
        String dognames = getResources().getStringArray(R.array.titles)[i];
        String doginfo = getResources().getStringArray(R.array.info)[i];
        int imageId = getResources().getIdentifier(dognames.toLowerCase(Locale.getDefault()), "drawable", this.getPackageName());

        Properties a = new Properties(dognames, doginfo, imageId);
        dogList.add(a);

    }

    adapter.notifyDataSetChanged();
}

@Override
public void onClick(View v) {

}

/**
 * RecyclerView item decoration - give equal margin around grid item
 */
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {

    private int spanCount;
    private int spacing;
    private boolean includeEdge;

    public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
        this.spanCount = spanCount;
        this.spacing = spacing;
        this.includeEdge = includeEdge;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int position = parent.getChildAdapterPosition(view); // item position
        int column = position % spanCount; // item column

        if (includeEdge) {
            outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
            outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)

            if (position < spanCount) { // top edge
                outRect.top = spacing;
            }
            outRect.bottom = spacing; // item bottom
        } else {
            outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
            outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)
            if (position >= spanCount) {
                outRect.top = spacing; // item top
            }
        }
    }
}

/**
 * Converting dp to pixel
 */
private int dpToPx(int dp) {
    Resources r = getResources();
    return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()));
}
}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
私人回收站;
专用适配器;
私人名单;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
initcollasingToolbar();
recyclerView=(recyclerView)findViewById(R.id.recycler\u视图);
dogList=newarraylist();
适配器=新适配器(此,狗列表);
RecyclerView.LayoutManager mLayoutManager=新的GridLayoutManager(这个,2);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.addItemDecoration(新的GridSpacingItemDecoration(2,dpToPx(10),真));
setItemAnimator(新的DefaultItemAnimator());
recyclerView.setAdapter(适配器);
prepareCards();
试一试{
滑翔。用(这个)。装载(R.drawable.Australian_shepherd)。进入((图像视图)findViewById(R.id.Background));
}捕获(例外e){
e、 printStackTrace();
}
}
/**
*初始化折叠工具栏
*将在滚动条上显示和隐藏工具栏标题
*/
私有void initCollasingToolbar(){
最终折叠工具栏布局折叠工具栏=
(折叠工具栏布局)findViewById(R.id.折叠工具栏);
折叠Toolbar.setTitle(“”);
AppBarLayout AppBarLayout=(AppBarLayout)findViewById(R.id.appbar);
appBarLayout.setExpanded(true);
//工具栏展开和折叠时隐藏和显示标题
appBarLayout.addOnOffsetChangedListener(新的appBarLayout.OnOffsetChangedListener(){
布尔isShow=false;
int scrollRange=-1;
@凌驾
公共无效onOffsetChanged(AppBarLayout AppBarLayout,int verticalOffset){
如果(滚动范围==-1){
scrollRange=appBarLayout.getTotalScrollRange();
}
如果(滚动范围+垂直偏移==0){
collasingToolbar.setTitle(getString(R.string.app_name));
isShow=true;
}否则,如果(isShow){
折叠Toolbar.setTitle(“”);
isShow=假;
}
}
});
}
私有空制备卡(){
int librarySize=getResources().getStringArray(R.array.titles).length;
for(int i=0;i=spanCount){
outRect.top=间距;//项目顶部
}
}
}
}
/**
*将dp转换为像素
*/
专用int dpToPx(int dp){
Resources r=getResources();
holder.overflow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showPopupMenu(holder.overflow, position);
        }
    });
private void showPopupMenu(View view, int pos) {
    // inflate menu
    PopupMenu popup = new PopupMenu(mContext, view);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.menu, popup.getMenu());
    popup.setOnMenuItemClickListener(new MyMenuItemClickListener(pos));
    popup.show();
}
class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener {

    int pos;

    public MyMenuItemClickListener(int pos) {
        this.pos = pos;
    }

    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        switch (menuItem.getItemId()) {
            case R.id.action_add_favourite:
                Toast.makeText(mContext, "Add to favourite", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_more_info:
                Intent slideStart = new Intent(mContext, SlideViewActivity.class);

                super.getClass();

                slideStart.putExtra("position", pos);

                slideStart.putExtra("list", (Serializable) dogList);

                mContext.startActivity(slideStart);
                return true;
            default:
        }
        return false;
    }
}