2015-02-27 14 views
31

ich ein recyclerView bin mit meiner listitems im navigation drawer .Ich die onclickListener umgesetzt haben zu zeigen, aber ich stecken haben, wie eine andere activity zu öffnen, wenn Artikelclicked sind. Alle meine Items machen auf Item Klick ab sofort wie im Code angezeigt wird, um eine mit der item position anzuzeigen.Wie eine andere Aktivität auf recyclerView Element öffnen Onclick

Ich würde die Hilfe zu schätzen wissen.

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 
+0

Haben Sie versucht, meine Lösung? –

+0

Warum wurde dieses javascritp markiert? Entfernen des Tags –

+1

Ich verbrachte ein paar Stunden damit, dies zu vermasseln. Call onclick von mehreren Orten (recycler, viewholder, und wieder in einer button.setOnClick .... vergessen, die neue Aktivität in manifest>. < –

Antwort

60

können Sie (aber nicht müssen, weil die ViewHolder Klasse ist nicht statisch) Feld Kontext erstellen, wie unten dargestellt:

private final Context context; 

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

und auf Ihrer onClick Methode wie unter etw nennen:

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

oder

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

Vielen Dank Sie meine Zeit gespeichert .... + 1 Abstimmung für Ihre Antwort .. . (: –

+0

Was ist zu tun, wenn ich auf Klick-Listener in MainActivity nicht den Adapter anwenden möchte? –

+0

Diese Lösung funktionierte nicht für mich, ich musste es in 'onBindViewHolder' machen. Mein Adapter läuft von innerhalb eines Fragments, das Vielleicht habe ich etwas mit dieser Lösung zu tun – Paradox

2

Sie Ihre Adapters OnClickListener implementieren können:

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

und

darin Schnittstelle mit Methode
public interface mClickListener { 
    public void mClick(View v, int position); 
} 

und in Ihrem onClick Methode die Methode in der Schnittstelle aufrufen und die Aussicht und Lage

in Ihrer Haupttätigkeit implementieren diese Schnittstelle

public class MainActivity extends ActionBarActivity implements AdapterClass.mClickListener 

und überschreiben diese Methode

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

passieren wie es besser ist, Ihre Aktivität Übergang durch die Aktivität nicht andere Klassen zu verwalten

+0

Ich habe diese Lösung noch nicht versucht, kann es beim Starten verschiedener Aktivitäten arbeiten? –

+0

sagen, wenn Ihre Recyclerview zwei Elemente haben ... Sie verwenden zwei Methoden in der Schnittstelle für jedes Element und überschreiben beide sie in der Haupttätigkeit und machen jeder von ihnen eine andere Tätigkeit beginnen und so weiter –

+0

, um zu zeigen, dass Ihr Einzelteil gedrückt worden ist, können Sie einen Kräuselungeffekt für Lutscher oder selec hinzufügen Tor für pre-Lollipop in Ihrem res/drawable/file.xml und im Layout den Hintergrund des Elements, klicken Sie auf diese Datei.xml –

0

Einfach können Sie es einfach machen .. Sie müssen nur den Kontext Ihrer Aktivität von hier aus sehen.

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

Denken Sie daran, dass Sie AndroidManifest.xml ändern müssen und legen Sie die Aktivität ...

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

@Neo, aber wenn Sie innerhalb von Fragment müssen Aufruf der Ansicht zu Umfang –

+0

Sie haben Recht @Dani, eigentlich habe ich von jemandem redigiert bearbeitet, das war unvollständig. Mein Fehler. Zurück zu altem Code ... Sory Liebes. – Neo

+0

Besser ist es jedoch, den Kontext innerhalb des Adapters zu übergeben. Es ist riskant, Kontext von einer Ansicht zu bekommen, und nicht empfehlenswert. Nur ein Vorschlag. – Neo

1

Diese Frage gestellt wurde schon vor langer Zeit, jedenfalls würde ich eine einfache Antwort schreiben kann jemand helfen.

Der einfachste Weg, um eine clicklistener, um Elemente von RecyclerView im Adapter ist als unten anbringt:

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getContext() , yourActivity.Class) 
       startActivity(intent); 
      } 
     }); 

} 
1
  • Probe, in MyRecyclerViewAdapter, fügen Methode:

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

Es zeigt die Unterstreichung, dass die Methode onItemClick niemals verwendet wird, obwohl ich die ItemClickListener-Klasse in MainActivity implementiert habe. –

Verwandte Themen