2017-03-16 73 views
-1

在我的項目中,包括recyclerview和卡片,問題是當我想爲每張卡片打電話時。我已經嘗試過其他方法,但是我無法解決我的問題。帶卡片的RecyclerView。爲每張卡片打開新的活動

RVAdapter.java

package com.example.ivann.card2; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.List; 

/** 
* Created by ivann on 15/03/2017. 
*/ 

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> { 
    private Context context; 

    public RVAdapter(Context context){ 
     this.context = context; 
    } 
    public class PersonViewHolder extends RecyclerView.ViewHolder { 
     CardView cv; 
     TextView personName; 
     TextView personAge; 
     ImageView personPhoto; 

     public PersonViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView)itemView.findViewById(R.id.cv); 
      personName = (TextView)itemView.findViewById(R.id.person_name); 
      personAge = (TextView)itemView.findViewById(R.id.person_age); 
      personPhoto = (ImageView)itemView.findViewById(R.id.person_photo); 


    //Problem 
      itemView.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v) { 

        final Intent intent; 
        if (getAdapterPosition() == 0){ 
         intent = new Intent(context, LaveryActivity.class); 
        } else if (getAdapterPosition() == 1){ 
         intent = new Intent(context, emma.class); 
        } else { 
         intent = new Intent(context, lilie.class); 
        } 
        context.startActivity(intent); 
       } 
      }); 

     } 
    } 

    List<Person> persons; 

    RVAdapter(List<Person> persons){ 
     this.persons = persons; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); 
     PersonViewHolder pvh = new PersonViewHolder(v); 
     return pvh; 
    } 

    @Override 
    public void onBindViewHolder(PersonViewHolder personViewHolder, int i) { 
     personViewHolder.personName.setText(persons.get(i).name); 
     personViewHolder.personAge.setText(persons.get(i).age); 
     personViewHolder.personPhoto.setImageResource(persons.get(i).photoId); 
    } 

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

CardViewActivity.java

package com.example.ivann.card2; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ImageView; 
import android.widget.TextView; 


public class CardViewActivity extends Activity{ 

    TextView personName; 
    TextView personAge; 
    ImageView personPhoto; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.cardview_activity); 
     personName = (TextView)findViewById(R.id.person_name); 
     personAge = (TextView)findViewById(R.id.person_age); 
     personPhoto = (ImageView)findViewById(R.id.person_photo); 

     personName.setText("Emma Wilson"); 
     personAge.setText("23 years old"); 
     personPhoto.setImageResource(R.drawable.emma); 
    } 
} 

登錄

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.ivann.card2, PID: 13042 
       java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
        at android.content.ComponentName.<init>(ComponentName.java:128) 
        at android.content.Intent.<init>(Intent.java:4868) 
        at com.example.ivann.card2.RVAdapter$PersonViewHolder$1.onClick(RVAdapter.java:44) 
        at android.view.View.performClick(View.java:5610) 
        at android.view.View$PerformClick.run(View.java:22265) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
Application terminated. 
+0

這'itemView.setOnClickListener'看起來很好。你爲什麼評論它? –

回答

0

只是取消註釋這條線。這是應該如何完成的。

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

它不起作用,我不能直接調用Intent intent = new Intent(v.getContext(),LaveryActivity.class); 我正在使用RecyclerView。 –

0

您cardview clicklistener應該在onBindViewHolder()

Context context; //Declare globally 

    personViewHolder.cv.setOnClickListener(new View.OnClickListener(){ 

       @Override 
       public void onClick(View v) { 

    Intent i =new Intent(context, LaveryActivity.class); 
        context.startActivity(i); 

       } 
      }); 
0

其實你可以從RecyclerView適配器直接調用意向.....

從活動中刪除Recyclerview的addOnItemTouchListener既會不能一起工作......

在你裏面Activity ..

RVAdapter adapter = new RVAdapter(persons,RecyclerViewActivity.this); 
rv.setAdapter(adapter); 

嘗試在Adapter構造函數中傳遞活動對象。

RVAdapter(List<Person> persons,Activity activity){ 
     this.persons = persons; 
     this.activity=activity; 
    } 

並與ItemView控件ClickListener去,但在onBindViewHolder()

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