RecyclerView单个商品ID [英] RecyclerView Single Item ID

查看:61
本文介绍了RecyclerView单个商品ID的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在改版我在Internet上找到的示例应用程序. (learn2crack) 我想在我的ReclycerView中获取单行的ID.这是代码.

E i'm modding an example app i found on the Internet. (learn2crack) I want to get the ID of a single row in my ReclycerView. Here's the code.

主要

    private void initViews(){
    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(layoutManager);

    ArrayList<AndroidVersion> androidVersions = prepareData();
    DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions);
    recyclerView.setAdapter(adapter);
    recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener(){

        @Override
        public void onTouchEvent(RecyclerView recycler, MotionEvent event) {
            Toast.makeText(getApplicationContext(),"Here i need the ID of the clicked row",Toast.LENGTH_SHORT).show();
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView recycler, MotionEvent event) {
            return true;
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean a){

        }

    });

}
private ArrayList<AndroidVersion> prepareData(){

    ArrayList<AndroidVersion> android_version = new ArrayList<>();
    for(int i=0;i<android_version_names.length;i++){
        AndroidVersion androidVersion = new AndroidVersion();
        androidVersion.setAndroid_version_name(android_version_names[i]);
        androidVersion.setAndroid_image_url(android_image_urls[i]);
        android_version.add(androidVersion);
    }
    return android_version;
}

适配器

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private ArrayList<AndroidVersion> android_versions;
private Context context;


public DataAdapter(Context context,ArrayList<AndroidVersion> android_versions) {
    this.context = context;
    this.android_versions = android_versions;

}

@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, final int i) {

    viewHolder.tv_android.setText(android_versions.get(i).getAndroid_version_name());
    Picasso.with(context).load(android_versions.get(i).getAndroid_image_url()).resize(120, 60).into(viewHolder.img_android);
    viewHolder.tv_android.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View argi) {
            //Toast.makeText(context,String.valueOf(i),Toast.LENGTH_SHORT).show();

        }
    });

}

@Override
public int getItemCount() {
    return android_versions.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    TextView tv_android;
    ImageView img_android;
    public ViewHolder(View view) {
        super(view);

        tv_android = (TextView)view.findViewById(R.id.tv_android);
        img_android = (ImageView)view.findViewById(R.id.img_android);
    }
}

如您所见,我做了一些更改.我要实现的行为是这样的: 当我单击ReclyclerView按钮之一时,我要打印其"id"(我在适配器中使用的相同内容,现在在注释后面.) 我想为每个点击/类别加载不同的recyclerview.因此,我需要一个保护套,但我需要从recyclerview中获取每个单独的ID. 如果我使用的是适配器版本",则每次单击都将显示"1","2",依此类推.但是我需要在main上进行此工作,因此我可以再次调用InitViews()或调用它的修改版本. 我在寻找类似的东西:int id1 = recycleritem.getid(); 任何的想法? 预先感谢.

As you can see, i did some change. The beahviour i'm trying to implemente is this: When i click on one of the ReclyclerView button i want to print its "id"(the same thing i used in the adapter, that now is behind comment. I want to Load a different recyclerview for every click / category. So i'm gonna need a switch-case, but ofc i need to get every single ID from the recyclerview. If i use the "adapter version" it works, every click displays "1", "2" and so on. But i need this to work on main, so i can call InitViews() again, or call a modified version of it. I'm looking for something like: int id1=recycleritem.getid(); Any idea? Thanks in advance.

推荐答案

请勿在RecyclerView本身上使用OnTouch事件.

Don't use the OnTouch event on the RecyclerView itself.

onBindViewHolder中的视图上设置OnClick.触发后,请触摸Activity并触摸所触摸的项目所在的行.

Set up an OnClick on the view in onBindViewHolder. When it is fired, call back to the Activity with the row of the touched item.

使用界面创建适配器

    MyAdapter adp=new MyAdapter(new MyAdapter.InterfaceCommands() {
        @Override
        public void OnItemPressed(int position) {
            // do something
        }
    });

示例适配器不完整.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH> {

    public MyAdapter(InterfaceCommands i) {
        MyCommands = i;
    }

    public interface InterfaceCommands {

        public void OnItemPressed(int position);

    }

    private InterfaceCommands MyCommands;

    @Override
    public void onBindViewHolder(final MyAdapter.VH holder, final int position) {

        // Set Up ViewHolder pattern
        // ....

        holder.containerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int position = holder.getAdapterPosition();

                MyCommands.OnItemPressed(position);

            }
        });

    }

}

这篇关于RecyclerView单个商品ID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆