如何打开上recyclerView项不同的活动的onclick [英] How to open a different activity on recyclerView item onclick

查看:141
本文介绍了如何打开上recyclerView项不同的活动的onclick的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 recyclerView 来显示我的时listItems 抽屉式导航。我已经实现了 onclickListener ,但我一直停留在如何打开一个不同的活动时, 点击。我的所有项目做项目点击截至目前为每code是显示面包项目位置

我会AP preciate的帮助。

AdapterClass.java

公共类AdapterClass扩展RecyclerView.Adapter< AdapterClass.MyViewHolder> {     私人LayoutInflater充气;     私人上下文的背景下; 列表与LT;信息>数据= Collections.emptyList();     公共AdapterClass(上下文的背景下,列表与LT;信息>数据){         this.context =背景;         充气= LayoutInflater.from(上下文);         this.data =数据;     }     @覆盖     公共MyViewHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){        查看查看= inflater.inflate(R.layout.custom_row,父母,假);         MyViewHolder持有人=新MyViewHolder(视图);         回报持有人;     }     @覆盖     公共无效onBindViewHolder(MyViewHolder持有人,INT位置){         信息电流= data.get(位置);         holder.title.setText(current.title);         holder.icon.setImageResource(current.iconId);     }     @覆盖     公众诠释getItemCount(){         返回data.size();     }     类MyViewHolder扩展RecyclerView.ViewHolder实现View.OnClickListener {         TextView的称号;         ImageView的图标;         公共MyViewHolder(查看ItemView控件){             超(ItemView控件);             标题=(TextView中)itemView.findViewById(R.id.listText);            图标=(ImageView的)itemView.findViewById(R.id.listIcon);             itemView.setClickable(真正的);             itemView.setOnClickListener(本);         }         @覆盖         公共无效的onClick(视图v){             Toast.makeText(背景下,单击的项目是:+为getPosition(),Toast.LENGTH_SHORT).show();         }     }; }

 实施康拉德的解决方案后,登录猫错误

    02-27 15:24:52.833:D / AndroidRuntime(1630):---------开始崩溃
02-27 15:24:52.834:E / AndroidRuntime(1630):致命异常:主要
02-27 15:24:52.834:E / AndroidRuntime(1630):工艺:com.snappy.stevekamau.snappy,PID:1630
02-27 15:24:52.834:E / AndroidRuntime(1630):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.snappy.stevekamau.snappy / com.snappy.stevekamau.snappy.YourActivity}:java.lang中.NullPointerException:尝试在空对象引用调用虚拟方法java.lang.CharSequence中android.support.v7.widget.Toolbar.getTitle()
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.ActivityThread.access $ 800(ActivityThread.java:144)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1278)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.os.Handler.dispatchMessage(Handler.java:102)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.os.Looper.loop(Looper.java:135)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.ActivityThread.main(ActivityThread.java:5221)
02-27 15:24:52.834:E / AndroidRuntime(1630):在java.lang.reflect.Method.invoke(本机方法)
02-27 15:24:52.834:E / AndroidRuntime(1630):在java.lang.reflect.Method.invoke(Method.java:372)
02-27 15:24:52.834:E / AndroidRuntime(1630):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899)
02-27 15:24:52.834:E / AndroidRuntime(1630):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
02-27 15:24:52.834:E / AndroidRuntime(1630):显示java.lang.NullPointerException:产生的原因试图调用虚拟方法java.lang.CharSequence中android.support.v7.widget.Toolbar.getTitle()在一个空对象引用
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.support.v7.internal.widget.ToolbarWidgetWrapper< INIT>(ToolbarWidgetWrapper.java:95)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.support.v7.internal.widget.ToolbarWidgetWrapper< INIT>(ToolbarWidgetWrapper.java:88)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.support.v7.internal.app.ToolbarActionBar< INIT>(ToolbarActionBar.java:84)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.support.v7.app.ActionBarActivityDelegateBase.setSupportActionBar(ActionBarActivityDelegateBase.java:175)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.support.v7.app.ActionBarActivity.setSupportActionBar(ActionBarActivity.java:92)
02-27 15:24:52.834:E / AndroidRuntime(1630):在com.snappy.stevekamau.snappy.YourActivity.onCreate(YourActivity.java:18)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.Activity.performCreate(Activity.java:5933)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
02-27 15:24:52.834:E / AndroidRuntime(1630):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
02-27 15:24:52.834:E / AndroidRuntime(1630):10 ...更多
02-27 15:24:52.839:W / ActivityManager(464):强制完成活动com.snappy.stevekamau.snappy / .YourActivity
02-27 15:24:52.841:W / ActivityManager(464):强制完成活动com.snappy.stevekamau.snappy / .MainActivity
 

解决方案

我觉得很容易。你可以(但你不必因为ViewHolder类不是静态的)创建领域上下文如下:

 私人最终上下文的背景下;

    公共MyViewHolder(查看ItemView控件){
        超(ItemView控件);
        上下文= itemView.getContext();
        ...
    }
 

和您的onClick方法只需要调用某事象下面这样:

  @覆盖
    公共无效的onClick(视图v){

        最终意图的意图;
        开关(getPostion()){
            情况下0:
               意图=新的意图(背景下,FirstActivity.class);
               打破;

            情况1:
                意图=新的意图(背景下,SecondActivity.class);
                打破;
               ...
            默认:
               意图=新的意图(背景下,DefaultActivity.class);
               打破;
         }
        context.startActivity(意向);
    }
 

  @覆盖
    公共无效的onClick(视图v){

        最终意图的意图;
        如果(为getPosition()==某物){
           意图=新的意图(背景下,OneActivity.class);
        }否则,如果(为getPosition()== STH2){
           意图=新的意图(背景下,SecondActivity.class);
        } 其他 {
           意图=新的意图(背景下,DifferentActivity.class);
        }
        context.startActivity(意向);
    }
 

i am using a recyclerView to show my listitems in the navigation drawer.I have implemented the onclickListener but i have been stuck on how to open a different activity when items are clicked. All my items do on item click as of now as per the code is to display a toast with the item position.

I would appreciate the help.

AdapterClass.java

public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder> {
    private LayoutInflater inflater;
    private Context context;
List<Information>data= Collections.emptyList();
    public AdapterClass(Context context,List<Information>data){
        this.context=context;

        inflater= LayoutInflater.from(context);
        this.data=data;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       View view= inflater.inflate(R.layout.custom_row,parent,false);
        MyViewHolder holder=new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Information current=data.get(position);
        holder.title.setText(current.title);
        holder.icon.setImageResource(current.iconId);

    }

    @Override
    public int getItemCount() {
        return data.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView title;
        ImageView icon;

        public MyViewHolder(View itemView) {
            super(itemView);
            title=(TextView)itemView.findViewById(R.id.listText);
           icon=(ImageView)itemView.findViewById(R.id.listIcon);
            itemView.setClickable(true);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {

            Toast.makeText(context,"The Item Clicked is: "+getPosition(),Toast.LENGTH_SHORT).show();
        }
    };
}

Log  cat error after implementing Konrad's solution

    02-27 15:24:52.833: D/AndroidRuntime(1630): --------- beginning of crash
02-27 15:24:52.834: E/AndroidRuntime(1630): FATAL EXCEPTION: main
02-27 15:24:52.834: E/AndroidRuntime(1630): Process: com.snappy.stevekamau.snappy, PID: 1630
02-27 15:24:52.834: E/AndroidRuntime(1630): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.snappy.stevekamau.snappy/com.snappy.stevekamau.snappy.YourActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.os.Handler.dispatchMessage(Handler.java:102)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.os.Looper.loop(Looper.java:135)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.ActivityThread.main(ActivityThread.java:5221)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at java.lang.reflect.Method.invoke(Native Method)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at java.lang.reflect.Method.invoke(Method.java:372)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
02-27 15:24:52.834: E/AndroidRuntime(1630): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:95)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:88)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.support.v7.internal.app.ToolbarActionBar.<init>(ToolbarActionBar.java:84)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.support.v7.app.ActionBarActivityDelegateBase.setSupportActionBar(ActionBarActivityDelegateBase.java:175)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.support.v7.app.ActionBarActivity.setSupportActionBar(ActionBarActivity.java:92)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at com.snappy.stevekamau.snappy.YourActivity.onCreate(YourActivity.java:18)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.Activity.performCreate(Activity.java:5933)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
02-27 15:24:52.834: E/AndroidRuntime(1630):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
02-27 15:24:52.834: E/AndroidRuntime(1630):     ... 10 more
02-27 15:24:52.839: W/ActivityManager(464):   Force finishing activity com.snappy.stevekamau.snappy/.YourActivity
02-27 15:24:52.841: W/ActivityManager(464):   Force finishing activity com.snappy.stevekamau.snappy/.MainActivity

解决方案

I think that it is easy. You can (but you don't have to because ViewHolder class is not static) create field context as is shown below:

    private final Context context;

    public MyViewHolder(View itemView) {
        super(itemView);
        context = itemView.getContext();
        ...
    }

and on your onClick method just call sth like below:

    @Override
    public void onClick(View v) {          

        final Intent intent;
        switch (getPostion()){
            case 0:
               intent =  new Intent(context, FirstActivity.class);
               break;

            case 1:
                intent =  new Intent(context, SecondActivity.class);
                break;
               ...
            default:
               intent =  new Intent(context, DefaultActivity.class);
               break;
         }
        context.startActivity(intent);
    }

or

    @Override
    public void onClick(View v) {          

        final Intent intent;
        if (getPosition() == sth){
           intent =  new Intent(context, OneActivity.class);
        } else if (getPosition() == sth2){
           intent =  new Intent(context, SecondActivity.class);
        } else {
           intent =  new Intent(context, DifferentActivity.class);
        }
        context.startActivity(intent);
    }

这篇关于如何打开上recyclerView项不同的活动的onclick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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