2017-10-10 50 views
-2

我正在創建將使用Hashtag的應用程序。現在到目前爲止,我正在使用AutoLinkTextClick!和一切正常,當有人在確定主題標籤點擊應用程序崩潰與錯誤,除了罰款:從助手類(適配器)啓動Intent返回java.lang.NullPointerException:

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

所以我對什麼可能導致它與人建議使用getContext()getActvity()但既不能讀上幾乎所有的StackOverflow這是有效的,因爲我試圖從適配器啓動這個意圖,而不是從一個擴展活動或從一個片段的類,所以我非常感謝你的幫助。

非常感謝您在這件事上的時間和協助。下面是我的適配器和錯誤代碼正在顯示:)

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


    } 

} 

} 

錯誤正在顯示的

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

你是如何在活動中加入列表和活動PARAMS?你能向我們展示你的活動嗎? –

+0

地方添加代碼如何傳遞活動引用到適配器 –

回答

2

你不應該從RecyclerView適配器推出的活動。相反,您需要創建一個偵聽器,其中適配器所在的Activity/Fragment需要實現。適配器應該只做它的工作,這是顯示適配器的內容。

事情是這樣的:

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

      } 
     }); 
     ... 

    } 
} 

然後設置監聽器上的活動或片段:

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

對於downvoter,請注意解釋downvote的原因? –

+0

你的建議是對的我不知道地球上的誰低估了這一點。並沒有解釋原因 –

+0

@AbdulWaheed:我想我是一個匆匆忙忙的downvoter的受害者。感謝您的鼓勵評論;) –

相關問題