-2

I'm creating an app that will use Hashtag. Now so far I'm using AutoLinkTextClick! and everything works fine except when someone clicks on the identified hashtag the app crash with an error:

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

So I have read almost all over StackOverflow about what might be causing it and people suggest to use getContext() or getActvity() but neither of this works because I'm trying to launch that intent from an adapter and not from a class that extends activity or from a fragment, so I would very well appreciate for your help guys.

Thank you very much for your time and assistance in this matter. Below is my code for the adapter and error that is being displayed :)

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


    }

}

}

The error that is being displayed is

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
ישו אוהב אותך
  • 28,609
  • 11
  • 78
  • 96

1 Answers1

3

You should not launch an Activity from the RecyclerView adapter. Instead, you need to create a listener which the Activity/Fragment where the adapter reside need to implement. Adapter should only do its job, that's showing the content of the adapter.

Something like this:

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

            }
        });
        ...

    }
}

Then set the listener on your Activity or 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);
    }
});
ישו אוהב אותך
  • 28,609
  • 11
  • 78
  • 96