estoy usando un recyclerView para mostrar mi listitems en el navigation drawer.He implementado el onclickListener pero se me ha atascado en la forma de abrir diferentes activity cuando elementos son clicked. Todos mis artículos sobre el elemento, haga clic en a partir de ahora como por el código es mostrar una toast con el item position.

Agradecería la ayuda.

AdapterClass.java

JS:

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
  • Intenta mi solución?
  • Por qué fue este etiquetado javascritp? La eliminación de la etiqueta.
  • Pasé un par de horas a estropear esto. Llamar a onclick desde varios lugares (recycler, viewholder, y de nuevo en un botón.setOnClick….se olvidaron de poner la nueva actividad en el manifiesto de >.<
InformationsquelleAutor Steve Kamau | 2015-02-27

8 Comentarios

  1. 79

    Usted puede (pero no es necesario porque el ViewHolder clase no es estática) crear contexto de campo como se muestra a continuación:

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

    y en su onClick método de llamada sólo sth como la siguiente:

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

    o

    @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);
    }
    • Gracias has salvado mi tiempo….+1 voto por tu respuesta…(:
    • Qué hacer si quiero aplicar en haga clic en escucha en MainActivity no el Adaptador?
    • Esta solución no funciona para mí, tuve que hacerlo en onBindViewHolder. Mi adaptador se ejecuta desde el interior de un fragmento que podría tener algo que ver con ella.
  2. 5

    puede implementar su adaptador onClickListener:

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

    y el uso de la interfaz con el método en que

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

    y en su método onClick llamar al método en la interfaz y pasar la vista y la posición

    en su actividad principal implementar la interfaz

    public class MainActivity extends ActionBarActivity implements AdapterClass.mClickListener

    y reemplazar este método

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

    como su mejor para gestionar la actividad de la transición por la actividad no otras clases

    • No he probado esta solución, sin embargo,puede funcionar a partir de diferentes actividades?
    • decir si su recyclerview tienen dos elementos … se utilizan dos métodos en la interfaz, una para cada elemento y reemplazar dos de ellos en la actividad principal y hacer que cada uno de ellos iniciar una actividad diferente y así sucesivamente
    • para demostrar que su artículo ha sido presionada, puede agregar un efecto dominó para lollipop o selector para pre-lollipop en su res/drawable/file.xml y en el diseño de establecer el fondo del elemento que desea, haga clic en para que file.xml
  3. 2

    Simplemente puede hacer que sea fácil… Usted sólo tiene que conseguir el contexto de su actividad, aquí, desde su punto de Vista.

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

    Recuerde que usted necesita para modificar AndroidManifest.xml y lugar de la actividad…

    <activity
    android:name=".YourClass"
    android:label="Label for your activity"></activity>
    • pero si estás en el interior de un fragmento necesita llamar a ver a su alcance
    • Tienes razón @Dani, la verdad es que estaba revisando editado por alguien, que estaba incompleto. Mi error. Volviendo al antiguo código de… Asesor queridos.
    • Pero la mejor manera es pasar contexto en el interior del adaptador, llegar contexto desde un punto de vista es riesgoso en algún momento, y no se recomienda. Sólo una sugerencia.
  4. 2

    Esta pregunta se ha hecho hace mucho tiempo, de todos modos me gustaría escribir una respuesta fácil puede ayudar a alguien.

    La forma más sencilla de conectar un clickListener a los elementos de RecyclerView es en el Adaptador de la siguiente manera:

    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);
    }
    });
    }
    • Por favor, añadir detalles sobre cómo abrir Actividad DIFERENTE!
  5. 1
    • Ejemplo, en MyRecyclerViewAdapter, el método de adición:

      public interface ItemClickListener {
      void onItemClick(View view, int position);
      }
    • En 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;
      }
      }
    • Se muestra el subrayado que el método onItemClick nunca se utiliza incluso he implementado el ItemClickListener clase MainActivity.
  6. 0

    JS:

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

    JS:

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

  7. 0
    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);
    }
    });
    }
    }
    }
  8. -2

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

Dejar respuesta

Please enter your comment!
Please enter your name here