简体   繁体   English

如何在 recyclerView 项目上打开不同的活动 onclick

[英]How to open a different activity on recyclerView item onclick

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 .我使用的是recyclerView展示我listitemsnavigation drawer 。我已经实现了onclickListener但我一直卡在如何打开一个不同的activity项目时, clicked All my items do on item click as of now as per the code is to display a toast with the item position .根据代码,我的所有项目现在都在项目点击时显示item positiontoast

I would appreciate the help.我将不胜感激。

AdapterClass.java适配器类.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

You can (but don't need to because the ViewHolder class is not static) create field context as is shown below:您可以(但不需要,因为ViewHolder类不是静态的)创建字段上下文,如下所示:

private final Context context;

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

and on your onClick method just call sth like below:并在您的onClick方法上调用以下方法:

@Override
public void onClick(View v) {          

    final Intent intent;
    switch (getAdapterPostion()){
        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 (getAdapterPosition() == 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);
}

Simply you can do it easy... You just need to get the context of your activity, here, from your View.很简单,您可以轻松完成……您只需要在此处从您的视图中获取您的活动的上下文。

//Create intent getting the context of your View and the class where you want to go
Intent intent = new Intent(view.getContext(), YourClass.class);

//start the activity from the view/context
view.getContext().startActivity(intent); //If you are inside activity, otherwise pass context to this funtion

Remember that you need to modify AndroidManifest.xml and place the activity...请记住,您需要修改 AndroidManifest.xml 并将活动...

<activity
        android:name=".YourClass"
        android:label="Label for your activity"></activity>

you can implement your adapter's onClickListener:您可以实现适配器的 onClickListener:

  public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder>implements View.OnClickListener

and use interface with method in it并使用带有方法的接口

public interface mClickListener {
    public void mClick(View v, int position);
}

and in your onClick method call the method in the interface and pass it the view and position并在您的 onClick 方法中调用接口中的方法并将视图和位置传递给它

in your main activity implement that interface在您的主要活动中实现该接口

public class MainActivity extends ActionBarActivity implements AdapterClass.mClickListener

and override that method并覆盖该方法

@Override
public void onCommentsClick(View v, int position) {
    final Intent intent = new Intent(this, OtherActivity.class);
}

as its better to manage your activity transition by the activity not other classes因为最好通过活动而不是其他课程来管理您的活动过渡

This question has been asked long ago, anyway i would write an easy answer may it help someone.很久以前就有人问过这个问题,无论如何我会写一个简单的答案可能对某人有所帮助。

The easiest way to attach a clickListener to items of RecyclerView is within the Adapter as below:将 clickListener 附加到 RecyclerView 项目的最简单方法是在适配器内,如下所示:

public class MyAdapter extends RecyclerView.Adapter<AdapterClass.MyViewHolder> {

....

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), YourActivity.Class);
                startActivity(intent);
            }
        });
}
  • Sample, in MyRecyclerViewAdapter , add method:示例,在MyRecyclerViewAdapter 中,添加方法:

     public interface ItemClickListener { void onItemClick(View view, int position); }
  • In MainActivity.javaMainActivity.java 中

    @Override public void onItemClick(View view, int position) { Context context=view.getContext(); Intent intent=new Intent(); switch (position){ case 0: intent = new Intent(context, ChildActivity.class); context.startActivity(intent); break; } }
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private ArrayList<Android> android;
Context context;
private ImageView img;
public DataAdapter(Context contextN, ArrayList<Android> android) {
    this.android = android;
    this.context=contextN;
}

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

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

    viewHolder.tv_name.setText(android.get(i).getOffer());
    viewHolder.tv_version.setText(android.get(i).getOfferType());
    Picasso.with(context).load(android.get(i).getImg()).transform(new CircleTransform()).into(img);

}

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

public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView tv_name,tv_version,tv_api_level;

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

        tv_name = (TextView)view.findViewById(R.id.tv_name);
        tv_version = (TextView)view.findViewById(R.id.tv_version);
        img = (ImageView) view.findViewById(R.id.img);

                context = itemView.getContext();

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

                        int itemPosition = getLayoutPosition();
                        Toast.makeText(context, "" + itemPosition, Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(context,Show.class);
                        intent.putExtra("name",""+android.get(itemPosition).getOffer());
                        intent.putExtra("img",""+android.get(itemPosition).getImg());
                        context.startActivity(intent);

            }
        });
    }
}
}

The problem occurs in declaring context, while using Glide for ImageView or While using intent in recyclerview for item onClick.问题发生在声明上下文中,同时为 ImageView 使用 Glide 或在 recyclerview 中为 item onClick 使用 Intent。 I Found this working for me which helps me to Declare context to use in Glide or Intent or Toast.我发现这对我有用,这有助于我声明要在 Glide 或 Intent 或 Toast 中使用的上下文。

public class NoteAdapter extends FirestoreRecyclerAdapter<Note,NoteAdapter.NoteHolder> {

Context context;

public NoteAdapter(@NonNull FirestoreRecyclerOptions<Note> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull NoteHolder holder, int position, @NonNull Note model) {
    holder.r_tv.setText(model.getTitle());
    Glide.with(CategoryActivity.context).load(model.getImage()).into(holder.r_iv);

    context = holder.itemView.getContext();

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(context, SuggestActivity.class);
            context.startActivity(i);
        }
    });

}

@NonNull
@Override
public NoteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_category,parent,false);

    return new NoteHolder(v);
}

public static class NoteHolder extends RecyclerView.ViewHolder
{
    TextView r_tv;
    ImageView r_iv;

    public NoteHolder(@NonNull View itemView) {
        super(itemView);

        r_tv = itemView.findViewById(R.id.r_tv);
        r_iv = itemView.findViewById(R.id.r_iv);


    }
}
}

 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(); } }; }

 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(); } }; }

This question has been asked long ago but none of the answers above helped me out, though Milad Moosavi`s answer was very close.很久以前就有人问过这个问题,但上面的答案都没有帮助我,尽管Milad Moosavi 的答案非常接近。 To open a new activity from a certain position on the recycler view, the following code may help:要从回收器视图的某个位置打开一个新活动,以下代码可能会有所帮助:


    @Override
    public void onBindViewHolder(@NonNull TripViewHolder holder, int position) {
        Trip currentTrip = trips.get(position);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(v.getContext(), EditTrip.class);
                v.getContext().startActivity(intent);
            }
        });

        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Intent intent = new Intent(v.getContext(), ReadTripActivity.class);
                v.getContext().startActivity(intent);

                return false;
            }
        });
    }

iconView = (ImageView) itemLayoutView .findViewById(R.id.iconId); iconView = (ImageView) itemLayoutView .findViewById(R.id.iconId);

        itemLayoutView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(v.getContext(), SecondPage.class);
                v.getContext().startActivity(intent);
                Toast.makeText(v.getContext(), "os version is: " + feed.getTitle(), Toast.LENGTH_SHORT).show();
            }
        });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在RecyclerView中使用不同的数据和照片在项目单击上打开新的活动 - How to open new Activity on item click with different data and photo in RecyclerView Recyclerview item onClick 从 Main Activity Fragment 打开一个片段 - Recyclerview item onClick to open a fragment from Main Activity Fragment 如何从 recyclerview 项目打开活动? - How to open an activity from a recyclerview item? 如何在 recyclerview OnClick 上打开不同的片段 - how to open a different fragment on recyclerview OnClick 为每个项目添加Onclick on适配器以打开新的不同活动 - add Onclick on adapter for each item to open new different activity Recyclerview Onclick() 没有打开所需的活动 - Recyclerview Onclick() doesnt open the desired activity 如何根据RecyclerView中的单击项在新活动中打开特定片段 - How to open specific Fragment in new Activity depending on clicked item in RecyclerView 在Firebase RecyclerView中单击项目时如何打开新活动 - How to open a new activity when an item is clicked in Firebase RecyclerView 如何通过单击来自recyclerview的项目来打开新活动 - How to open new activity from clicking an item from recyclerview 在Firebase RecyclerView Cardview中单击项目时如何打开详细信息活动 - How to open a details activity when an item is clicked in Firebase RecyclerView Cardview
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM