Android 从RecyclerView中的项目获取位置数据
我最近从ListView迁移到RecyclerView。。。 一切似乎都很好,除了我不知道如何从RecyclerView项目中获取数据。。。 在ListView Item OnClick中,我以前使用过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
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));
}
}
}
}
});
}
}