2015-02-27 9 views
31

onclick मैं एक recyclerView उपयोग कर रहा हूँ दिखाने के लिए मेरी navigation drawer .मैं में listitemsonclickListener लागू कर दिया है, लेकिन मैं कैसे एक अलग activity खोलने के लिए जब आइटमclicked हैं पर अटक गया है। कोड के अनुसार अब मेरे सभी आइटम आइटम पर क्लिक करते हैं को item position के साथ प्रदर्शित करना है।कैसे recyclerView आइटम पर एक अलग गतिविधि को खोलने के लिए

मैं सहायता की सराहना करता हूं।

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

क्या आपने मेरा समाधान आजमाया? –

+0

यह टैग किया गया javascritp? टैग को हटा रहा है। –

+1

मैंने इसे जोड़ने में कुछ घंटे बिताए। एकाधिक स्थानों (रीसाइक्लर, व्यूहोल्डर, और फिर एक बटन में सेट पर कॉल करना .setOnClick .... नई गतिविधि को मैनिफेस्ट में डालने के लिए भूल गया>। < –

उत्तर

60

आप कर सकते हैं (लेकिन क्योंकि ViewHolder वर्ग स्थिर नहीं है की जरूरत नहीं है) के रूप में नीचे दिखाया गया है क्षेत्र संदर्भ बनाने के लिए:

private final Context context; 

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

और अपने onClick विधि बस नीचे की तरह sth फोन पर:

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

धन्यवाद आपने अपना समय बचाया .... आपके उत्तर के लिए 1 वोट .. (: –

+0

अगर मैं मुख्य गतिविधि में क्लिक श्रोता पर लागू करना चाहता हूं तो एडाप्टर नहीं है? –

+0

यह समाधान मेरे लिए काम नहीं करता है, मुझे इसे 'ऑनबिंडव्यूहोल्डर' में करना था। मेरा एडाप्टर एक टुकड़े के अंदर से चल रहा है इसके साथ कुछ करने के लिए हो सकता है। – Paradox

2

आप लागू कर सकते हैं अपने एडाप्टर के 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); 
} 

ओवरराइड गतिविधि के अनुसार आपकी गतिविधि संक्रमण को बेहतर बनाने के लिए बेहतर नहीं है अन्य वर्ग

+0

मैंने अभी तक इस समाधान की कोशिश की है, क्या यह विभिन्न गतिविधियों को शुरू करने पर काम कर सकता है? –

+0

कहें कि क्या आपके रीसाइक्लिंगव्यू में दो आइटम हैं ... आप प्रत्येक आइटम के लिए इंटरफ़ेस में दो विधियों का उपयोग करते हैं और दोनों को ओवरराइड करते हैं उन्हें मुख्य गतिविधि में और उनमें से प्रत्येक को एक अलग गतिविधि शुरू करें और –

+0

पर यह दिखाने के लिए कि आपका आइटम दबाया गया है, आप लॉलीपॉप या सेलेक के लिए एक लहर प्रभाव जोड़ सकते हैं अपने res/drawable/file.xml में प्री-लॉलीपॉप के लिए टोर और लेआउट में उस आइटम की पृष्ठभूमि सेट करें जिसे आप उस फ़ाइल पर क्लिक करना चाहते हैं। xml –

0

बस आप इसे आसान कर सकते हैं .. आपको अपने दृश्य से यहां अपनी गतिविधि का संदर्भ प्राप्त करने की आवश्यकता है।

//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 
     android:name=".YourClass" 
     android:label="Label for your activity"></activity> 
+0

@Neo लेकिन अगर आप खंड के अंदर हैं तो दायरे में दृश्य को कॉल करने की आवश्यकता है –

+0

आप सही @ डानी हैं, असल में मैं किसी के द्वारा संपादित की समीक्षा कर रहा था, जो अपूर्ण था। मेरी गलती। पुराने कोड पर वापस जा रहा है ... सोरी प्रिय। – Neo

+0

लेकिन एडाप्टर के अंदर संदर्भ पारित करने का बेहतर तरीका है, किसी दृश्य से संदर्भ प्राप्त करना कभी-कभी जोखिम भरा होता है, और इसकी अनुशंसा नहीं की जाती है। केवल एक सलाह। – Neo

1

यह सवाल बहुत पहले कहा गया है, वैसे भी मैं एक आसान जवाब यह किसी की मदद कर सकते हैं लिखेंगे।

RecyclerView की वस्तुओं के लिए एक clickListener संलग्न करने के लिए सबसे आसान तरीका है एडाप्टर के रूप में नीचे के भीतर है:

public interface ItemClickListener { 
    void onItemClick(View view, int position); 
} 
  • :,

    @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
    • नमूना MyRecyclerViewAdapter में, विधि जोड़ें में 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

    यह रेखांकित करता है कि इटैमक्लिक पर विधि का कभी भी उपयोग नहीं किया जाता है, यहां तक ​​कि मैंने मेनक्विटी लिस्टनर क्लास को मुख्य गतिविधि में लागू किया है। –

    संबंधित मुद्दे