2017-10-10 3 views
-2

Je crée une application qui utilisera Hashtag. Maintenant, jusqu'à présent, j'utilise AutoLinkTextClick! et tout fonctionne bien sauf quand quelqu'un clique sur le hashtag identifié le crash de l'application avec une erreur:Lancement Intent de la classe d'assistance (adaptateur) renvoie java.lang.NullPointerException:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

J'ai lu presque partout StackOverflow sur ce qui pourrait être la cause et les gens suggèrent d'utiliser getContext() ou getActvity() mais ni de cela fonctionne parce que j'essaye de lancer cette intention à partir d'un adaptateur et non d'une classe qui prolonge l'activité ou d'un fragment, ainsi j'apprécierais très bien pour votre aide les gars.

Merci beaucoup de votre temps et de votre aide dans ce dossier. Voici mon code pour l'adaptateur et l'erreur qui est affiché :)

package com.android.msahakyan.expandablenavigationdrawer.adapter; 
import android.app.Activity; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.support.v4.app.FragmentManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import android.support.v7.app.AlertDialog; 

import com.android.msahakyan.expandablenavigationdrawer.AboutUsActivity; 
import com.android.volley.toolbox.ImageLoader; 
import com.android.volley.toolbox.NetworkImageView; 
import com.android.msahakyan.expandablenavigationdrawer.R; 
import com.android.msahakyan.expandablenavigationdrawer.activity.FeedImageView; 
import com.android.msahakyan.expandablenavigationdrawer.model.Feed; 
import com.android.msahakyan.expandablenavigationdrawer.others.AppController; 
import com.luseen.autolinklibrary.AutoLinkMode; 
import com.luseen.autolinklibrary.AutoLinkOnClickListener; 
import com.luseen.autolinklibrary.AutoLinkTextView; 

import java.util.List; 

public class FeedsListAdapter extends  RecyclerView.Adapter<FeedsListAdapter.MyHolder> { 
private Activity activity; 
private LayoutInflater inflater; 
private List<Feed> feedItems; 
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 
//ImageLoader imageLoader = VolleySingleton.getInstance(context).getImageLoader() 
public FragmentManager f_manager; 



public FeedsListAdapter(Activity activity, List<Feed> feedItems) { 
    this.activity = activity; 
    this.feedItems = feedItems; 
} 


//INITIALIE VH 
//@Override 
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.feeds_home_row,parent,false); 
    MyHolder holder=new MyHolder(v); 
    return holder; 
} 

//BIND DATA 
// @Override 
public void onBindViewHolder(MyHolder holder, int position) { 

    //ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 
    if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 

    final Feed f = feedItems.get(position); 

    //Post images 
    holder.picture.setImageUrl(f.getPictureUrl(), imageLoader); // displays company profile image on post 
    holder.sms_image.setImageUrl(f.getMessagePictureUrl(), imageLoader); // displays post image on post 

    //autoLinkTextView.enableUnderLine(); 
    holder.messages.addAutoLinkMode(AutoLinkMode.MODE_HASHTAG); 
holder.messages.setAutoLinkText("this the sample message #test i need to test hashtag onClink and launch intent"); // 
    holder.messages.setAutoLinkOnClickListener(new AutoLinkOnClickListener() { 
     @Override 
     public void onAutoLinkTextClick(AutoLinkMode autoLinkMode, String matchedText) { 
      Intent intent = new Intent(activity, AboutUsActivity.class); 
      intent.putExtra("companyId", f.getCompanyId()); 
      activity.startActivity(intent); 
     } 
    }); 
    //holder.messages.setText(f.getMessage()); 
    //Linkify.addLinks(holder.messages, Linkify.ALL); //detect link that are in a message 
    holder.date_created.setText(f.getDateCreated()); 
    holder.company.setText(f.getCompany()); 

} 


/* 
TOTAL ITEMS 
*/ 

//@Override 
public int getItemCount() { 
    return feedItems.size(); 

} 

/* 
ADD DATA TO ADAPTER 
*/ 
public void add(Feed s) { 
    feedItems.add(s); 
    notifyDataSetChanged(); 
} 

/* 
CLEAR DATA FROM ADAPTER 
*/ 
public void clear() { 
    feedItems.clear(); 
    notifyDataSetChanged(); 
} 

/* 
VIEW HOLDER CLASS 
*/ 
class MyHolder extends RecyclerView.ViewHolder { 

    FeedImageView sms_image; 
    NetworkImageView picture; 
    //TextView messages; 
    AutoLinkTextView messages; 
    //AutoLinkTextView autoLinkTextView; 
    TextView date_created; 
    TextView company; 


    public MyHolder(View convertView) { 
     super(convertView); 


     this.sms_image = (FeedImageView) convertView.findViewById(R.id.sms_image); 
     NetworkImageView thumbnail = (NetworkImageView) convertView.findViewById(R.id.thumbnail); 
     this.picture = (NetworkImageView) convertView.findViewById(R.id.picture); 
     //this.messages = (TextView) convertView.findViewById(R.id.messages); 
     this.messages = (AutoLinkTextView) convertView.findViewById(R.id.messages); 
     this.date_created = (TextView) convertView.findViewById(R.id.date_created); 
     this.company = (TextView) convertView.findViewById(R.id.company); 
     //TextView status = (TextView) convertView.findViewById(R.id.status); 


    } 

} 

} 

L'erreur qui est affiché est

10-10 08:08:06.128 28368-28368/com.android.msahakyan.expandablenavigationdrawer E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.android.msahakyan.expandablenavigationdrawer, PID: 28368 
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:4666) 
     at com.android.msahakyan.expandablenavigationdrawer.adapter.FeedsListAdapter$1.onAutoLinkTextClick(FeedsListAdapter.java:87) 
     at com.luseen.autolinklibrary.AutoLinkTextView$1.onClick(AutoLinkTextView.java:77) 
     at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:217) 
     at com.luseen.autolinklibrary.LinkTouchMovementMethod.onTouchEvent(LinkTouchMovementMethod.java:38) 
     at android.widget.TextView.onTouchEvent(TextView.java:8689) 
     at android.view.View.dispatchTouchEvent(View.java:9787) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2686) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2335) 
     at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2461) 
     at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1780) 
     at android.app.Activity.dispatchTouchEvent(Activity.java:2853) 
     at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68) 
     at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2422) 
     at android.view.View.dispatchPointerEvent(View.java:10018) 
     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4738) 
     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4596) 
     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4101) 
     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4154) 
     at android.view 
+0

Comment gagnez-vous params la liste et l'activité de l'activité? pouvez-vous nous montrer votre activité aussi? –

+0

place ajoutez le code comment vous passez la référence d'activité à l'adaptateur –

Répondre

2

Vous ne devriez pas lancer une activité de l'adaptateur RecyclerView. Au lieu de cela, vous devez créer un écouteur que l'activité/fragment où l'adaptateur réside doit implémenter. L'adaptateur devrait seulement faire son travail, c'est montrer le contenu de l'adaptateur.

Quelque chose comme ceci:

public class FeedsListAdapter extends RecyclerView.Adapter<FeedsListAdapter.ViewHolder> { 
    // ... 

    /***** Creating OnItemClickListener *****/ 

    // Define listener member variable 
    private OnItemClickListener listener; 

    // Define the listener interface 
    public interface OnItemClickListener { 
     void onAutoLinkTextClick(String companyId); 
    } 

    // Define the method that allows the parent activity or fragment to define the listener 
    public void setOnItemClickListener(OnItemClickListener listener) { 
     this.listener = listener; 
    } 

    public void onBindViewHolder(MyHolder holder, int position) { 

     ... 
     holder.messages.setAutoLinkOnClickListener(new AutoLinkOnClickListener() { 
      @Override 
      public void onAutoLinkTextClick(AutoLinkMode autoLinkMode, String matchedText) { 
       listener.onAutoLinkTextClick(f.getCompanyId()); 

      } 
     }); 
     ... 

    } 
} 

Réglez ensuite l'auditeur sur votre activité ou Fragment:

FeedsListAdapter adapter = ...; 
adapter.setOnItemClickListener(new ContactsAdapter.OnItemClickListener() { 
    @Override 
    public void onAutoLinkTextClick(String companyId) { 
     Intent intent = new Intent(activity, AboutUsActivity.class); 
     intent.putExtra("companyId", f.getCompanyId()); 
     activity.startActivity(intent); 
    } 
}); 
+0

Pour le downvoter, vous voulez expliquer la raison de la downvote? –

+0

Votre suggestion est juste Je ne sais pas qui sur la terre downvoted cela. Et n'a pas expliqué la raison –

+0

@AbdulWaheed: Je suppose que je suis victime d'un downvoter hit-and-run. Merci pour votre commentaire encourageant;) –