【问题标题】:How to open a different activity on recyclerView item onclick如何在 recyclerView 项目 onclick 上打开不同的活动
【发布时间】:2015-02-27 14:29:55
【问题描述】:

我正在使用recyclerViewnavigation drawer 中显示我的listitems。我已经实现了onclickListener,但我一直被困在如何在项目 时打开不同的activity强> 是clicked。根据代码,我的所有项目现在都在项目点击时显示toastitem position

我将不胜感激。

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

【问题讨论】:

  • 你试过我的解决方案了吗?
  • 我花了几个小时搞砸了。从多个位置调用 onclick(回收器、视图持有者,然后在 button.setOnClick 中再次调用 ....忘记将新活动放在清单中>。

标签: android android-recyclerview


【解决方案1】:

您可以(但不需要,因为ViewHolder 类不是静态的)创建字段上下文,如下所示:

private final Context context;

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

然后在你的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);
}

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

【讨论】:

  • 如果我想在 MainActivity 而不是 Adapter 中应用点击监听器怎么办?
  • 这个解决方案对我不起作用,我必须在onBindViewHolder 中进行。我的适配器从可能与它有关的片段内部运行。
  • getAdapterPosition 变红了
【解决方案2】:

您可以轻松做到...您只需在此处从您的视图中获取活动的上下文。

//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

记住你需要修改AndroidManifest.xml并放置activity...

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

【讨论】:

  • @Neo 但如果您在片段内部,则需要将视图调用到范围
  • 你说得对@Dani,实际上我正在审查某人编辑的内容,这是不完整的。我的错。恢复到旧代码......对不起,亲爱的。
  • 但是更好的方法是在适配器内部传递上下文,有时从视图中获取上下文是有风险的,不推荐。只是一个建议。
【解决方案3】:

您可以实现适配器的 onClickListener:

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

并使用带有方法的接口

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

并在您的 onClick 方法中调用接口中的方法并将视图和位置传递给它

在您的主要活动中实现该接口

public class MainActivity extends ActionBarActivity implements AdapterClass.mClickListener

并覆盖该方法

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

因为通过活动而不是其他类来管理活动转换会更好

【讨论】:

  • 我还没有尝试过这个解决方案,它可以用于启动不同的活动吗?
  • 说如果你的recyclerview有两个项目......你在界面中使用两种方法,每个项目一个,并在主活动中覆盖它们,并使它们中的每一个开始一个不同的活动等等上
  • 要显示您的项目已被按下,您可以在 res/drawable/file.xml 中为棒棒糖添加涟漪效果或为棒棒糖前选择器,并在布局中设置项目的背景想点击那个file.xml
【解决方案4】:

这个问题很久以前就被问过了,无论如何我会写一个简单的答案可能对某人有所帮助。

将 clickListener 附加到 RecyclerView 项目的最简单方法是在 Adapter 中,如下所示:

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

【讨论】:

  • 请添加有关如何打开不同活动的详细信息!
  • public void onClick(View view) { Intent intent = new Intent(view.getContext(), YourActivity.Class); view.getContext().startActivity(intent);您必须使用 view.getContext().startActivity(intent) 行来启动活动。
【解决方案5】:
  • 示例,在MyRecyclerViewAdapter中,添加方法:

    public interface ItemClickListener {
       void onItemClick(View view, int position);
    }
    
  • MainActivity.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;
       }
    }
    

【讨论】:

  • 即使我在 MainActivity 中实现了 ItemClickListener 类,它也显示了 onItemClick 方法从未使用过的下划线。
【解决方案6】:
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);

            }
        });
    }
}
}

【讨论】:

    【解决方案7】:

    问题发生在声明上下文时,同时使用 Glide for ImageView 或在 recyclerview 中使用 Intent 时项目 onClick。我发现这对我有用,它可以帮助我声明要在 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);
    
    
        }
    }
    }
    

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        这个问题很久以前就被问过了,但上面的答案都没有帮助我,尽管Milad Moosavi`s answer 非常接近。 要从回收站视图的某个位置打开一个新活动,以下代码可能会有所帮助:

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

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-31
            • 2021-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多