Android 从RecyclerView中的项目获取位置数据

Android 从RecyclerView中的项目获取位置数据,android,listview,android-recyclerview,Android,Listview,Android Recyclerview,我最近从ListView迁移到RecyclerView。。。 一切似乎都很好,除了我不知道如何从RecyclerView项目中获取数据。。。 在ListView Item OnClick中,我以前使用过getItemAtPosition,但它不在RecyclerView中 以下是代码的相关部分…- MainActivity.java private SDKP mSelectedPackage; RecyclerView mRecyclerView; mRecyclerView.addOnIte

我最近从ListView迁移到RecyclerView。。。 一切似乎都很好,除了我不知道如何从RecyclerView项目中获取数据。。。 在ListView Item OnClick中,我以前使用过
getItemAtPosition
,但它不在RecyclerView中

以下是代码的相关部分…- MainActivity.java

private SDKP mSelectedPackage;
RecyclerView mRecyclerView;

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
            //I'm STUCK HERE!
             mSelectedPackage = (SDKPackage) mRecyclerView.getItemAtPosition(position);
                    openContextMenu(view);

  /*Toast.makeText(MainActivity.this, "Card at " + position + " is clicked", Toast.LENGTH_SHORT).show();*/
            }
        }));


@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        mSelectedPackage.inflateMenu(menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    } 

    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        return mSelectedPackage.onMenuClick(this, item);
    }
以下是inflateMenu(上下文菜单)方法-

public void inflateMenu(ContextMenu menu)
    {
        menu.setHeaderTitle(getPackageName());
        if (isDownloading())
        {
            menu.add(Menu.NONE, 256, Menu.NONE, "Cancel download");
        }
        else if (isInstalled())
        {
            menu.add(Menu.NONE, 257, Menu.NONE, "Uninstall");
        }
        else
        {
            int i = 0;
            for (SDKA archive : archives)
            {
                menu.add(Menu.NONE, i++, Menu.NONE, archive.getArchiveName());
            }
        }
    }

    public boolean onMenuClick(Activity parent, MenuItem item)
    {
        if (item.getItemId() >= 256)
            uninstall();
        else
        {
            SDKA archive = archives.get(item.getItemId());
            if (archive != null)
            {
                archive.onClick(parent);
            }
        }
        return true;
    }
当我使用ListView时,我使用-

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
            {
                @Override
                public void onItemClick(AdapterView<?> adapter, View view, int position, long arg)
                {
                    mSelectedPackage = (SDKP) mPackageList.getItemAtPosition(position);
                    openContextMenu(view);
                }
            });
mListView.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(适配器视图适配器、视图视图、整型位置、长参数)
{
mSelectedPackage=(SDKP)mPackageList.getItemAtPosition(位置);
openContextMenu(视图);
}
});

您应该将
视图.OnClickListener
设置为
回收视图.ViewHolder
类中的
项目视图

在recyclerview中没有与
getItemAtPosition()等价的对象。为了解决这个问题,您可以在适配器上创建一个接口,并在您的
ViewHolder
上实现该接口,它将侦听您的
onClick()

然后让您的
ViewHolder
实现该界面

public static class MyViewHolder extends RecyclerView.MyViewHolder implements View.OnClickListener {

private OnItemClickListener mListener;

public MyViewHolder(View itemView) {
    super(itemView);
    itemView.setOnClickListener(this);

}

 public MyViewHolder(View itemView, OnItemClickListener listener) {
    this(itemView);
    mListener = listener;
}


@Override
public void onClick(View v) {
    if (mListener != null) {
        mListener.onItemClick(v, getPosition());
    }
}
-或者,您可以使用rxjava

您可以通过多种方式实现这一点

1)通过实现RecyclerView.OnItemTouchListener,项目单击侦听器

导入android.content.Context;
导入android.support.v7.widget.RecyclerView;
导入android.view.GestureDetector;
导入android.view.MotionEvent;
导入android.view.view;
公共类RecyclerItemClickListener实现RecyclerView.OnItemTouchListener{
私人监听者;
公共接口侦听器{
公共虚线单击(视图,int位置);
}
手势检测器mGestureDetector;
公共RecyclerItemClickListener(上下文上下文,OnItemClickListener侦听器){
mListener=监听器;
mGestureDetector=new GestureDetector(上下文,new GestureDetector.SimpleOnGestureListener()){
@凌驾
公共布尔onSingleTapUp(运动事件e){
返回true;
}
});
}
@凌驾
公共布尔值onInterceptTouchEvent(RecyclerView视图,MotionEvent e){
View-childView=View.findChildViewUnder(e.getX(),e.getY());
if(childView!=null&&mListener!=null&&mGestureDetector.onTouchEvent(e)){
mListener.onItemClick(childView,view.getChildAdapterPosition(childView));
}
返回false;
}
@凌驾
public void onTouchEvent(RecyclerView视图、MotionEvent运动事件){
}

}
根据@Bob的建议,我这样做没有太多代码…:)

在我的适配器中,我实现了一个自定义方法,如-

public Object getMyPos(int pos){
         return packages.get(pos);
   }
&然后在RecyclerItem OnClick中,我使用它就像-

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
            mSelectedPackage = (SDKP) ((ShAdapter)mRecyclerView.getAdapter()).getMyPos(position);

                    openContextMenu(view);
            }
        }));

从RecyclerView中的项目获取位置数据

public class ViewHolder extends RecyclerView.ViewHolder {
  

    public ViewHolder(View itemView) {
        super(itemView);


    
        // on item click
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // get position
                int position = getAdapterPosition();

                // check if item still exists
                if (position != 0 || position!=RecyclerView.NO_POSITION){

                    // means if position is not equal to 0 and item exist
                    // then it should display a toast with the category name
                    // to the user when the category item or data is clicked

                    // get position of each item on recyclerView

        

                    CategoriesList clickedItem = categoriesLists.get(position);
                   Toast.makeText(v.getContext(), "You clicked " +clickedItem.getCatName(), Toast.LENGTH_SHORT).show();

    /* CategoryList is the model class i created so change it 
          with your model class
           */



// if you want to send the user to an activity when the item is clicked then 
// this is how to go about it 




                    if (position == 1){
                        v.getContext().startActivity(new Intent(v.getContext(), LoginActivity.class));
                    }
                    else{
                        if (position == 2){
                            v.getContext().startActivity(new Intent(v.getContext(), SignUpActivity.class));
                        }
                    }
                }
            }
        });
    }
}

那么如何在OnClickListener中获得像getItemAtPosition(int)这样的方法呢?:)您可以从
ViewHolder
调用
getAdapterPosition()
,这将为您提供适配器位置。使用位置,您可以从备份数据中获取项目-它可能来自
列表
光标
行,具体取决于您的实现。如果它位于列表中,该怎么办?
getAdapterPosition()
为您提供一个
位置
。现在您可以像这样从列表中获取项目:
List.get(position)
使用
getAdapterPosition()
如果您发现任何问题,请与我联系mensahokobright@gmail.com
public class ViewHolder extends RecyclerView.ViewHolder {
  

    public ViewHolder(View itemView) {
        super(itemView);


    
        // on item click
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // get position
                int position = getAdapterPosition();

                // check if item still exists
                if (position != 0 || position!=RecyclerView.NO_POSITION){

                    // means if position is not equal to 0 and item exist
                    // then it should display a toast with the category name
                    // to the user when the category item or data is clicked

                    // get position of each item on recyclerView

        

                    CategoriesList clickedItem = categoriesLists.get(position);
                   Toast.makeText(v.getContext(), "You clicked " +clickedItem.getCatName(), Toast.LENGTH_SHORT).show();

    /* CategoryList is the model class i created so change it 
          with your model class
           */



// if you want to send the user to an activity when the item is clicked then 
// this is how to go about it 




                    if (position == 1){
                        v.getContext().startActivity(new Intent(v.getContext(), LoginActivity.class));
                    }
                    else{
                        if (position == 2){
                            v.getContext().startActivity(new Intent(v.getContext(), SignUpActivity.class));
                        }
                    }
                }
            }
        });
    }
}