Question

Getting NullPointerException in accessing variable from other class.

Below is my RSS feed parser in activity which works very well, but when i try to access the same parameter for RemoteView (Home Screen Widget)in another class the parameter returns null pointer exception which clearly means value is null. Any idea how can i use same snippet of code and pick value from there. In code i have mentioned line "PICK VALUE (from where parameter value to be picked)" and PUT VALUE (where to put) for your better understanding.

My aim is to use TwitterAdapter in ListProvider class inside "populateListItem()" method where i wrote "PUT VALUE". There I want to access this value "imageAndTexts1.get(position).getTitle();" from TwitterAdapter class. How can i do that ?

If i try like this in method populateListItem() i will get below exception :

private void populateListItem() {
        //for (int i = 0; i < 10; i++) {
            ListItem listItem = new ListItem();

            TwitterAdapter abc = new TwitterAdapter(null, imageAndTexts1); //TRIED TO ACCESS VALUE
            String a = abc.passtitletowidget; // TRIED TO ACCESS VALUE

            listItem.heading = a;
            listItem.content = "This is the content of the app widget listview.Nice content though";
            listItemList.add(listItem);
        //}
    }

Exception detail :

02-28 13:42:22.271: E/AndroidRuntime(26600): FATAL EXCEPTION: main
02-28 13:42:22.271: E/AndroidRuntime(26600): java.lang.RuntimeException: Unable to bind to service com.wordpress.laaptu.WidgetService@42a2f118 with Intent { dat=intent: cmp=com.itcuties.multicategoryrssreader/com.wordpress.laaptu.WidgetService (has extras) }: java.lang.NullPointerException
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.app.ActivityThread.handleBindService(ActivityThread.java:2739)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.app.ActivityThread.access$1800(ActivityThread.java:168)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.os.Looper.loop(Looper.java:137)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.app.ActivityThread.main(ActivityThread.java:5493)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at java.lang.reflect.Method.invokeNative(Native Method)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at java.lang.reflect.Method.invoke(Method.java:525)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at dalvik.system.NativeStart.main(Native Method)
02-28 13:42:22.271: E/AndroidRuntime(26600): Caused by: java.lang.NullPointerException
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at com.rssfeed.adapter.TwitterAdapter.<init>(TwitterAdapter.java:47)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at com.wordpress.laaptu.ListProvider.populateListItem(ListProvider.java:42)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at com.wordpress.laaptu.ListProvider.<init>(ListProvider.java:34)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at com.wordpress.laaptu.WidgetService.onGetViewFactory(WidgetService.java:19)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.widget.RemoteViewsService.onBind(RemoteViewsService.java:241)
02-28 13:42:22.271: E/AndroidRuntime(26600):    at android.app.ActivityThread.handleBindService(ActivityThread.java:2726)

**PACKAGE ONE

TwitterAdapter.java

public class TwitterAdapter extends ArrayAdapter<RssFeedStructure> {
    List<RssFeedStructure> imageAndTexts1 = null;
    Context context;
    public static String passtitletowidget;         

    public TwitterAdapter(Activity activity,List<RssFeedStructure> imageAndTexts) {
        super(activity, 0, imageAndTexts);
        imageAndTexts1 = imageAndTexts;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        context = getContext();
        Activity activity = (Activity) getContext();
        LayoutInflater inflater = activity.getLayoutInflater();

        View rowView = inflater.inflate(R.layout.twitteradapter, null);
        TextView textView = (TextView) rowView.findViewById(R.id.feed_text);
        TextView timeFeedText = (TextView) rowView.findViewById(R.id.feed_updatetime);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.feed_image);
        try {               
            passtitletowidget = imageAndTexts1.get(position).getTitle();  //PICK VALUE    
            Log.d("rssfeed", "imageAndTexts1.get(position).getImgLink() :: " + imageAndTexts1.get(position).getImgLink() + " :: " + imageAndTexts1.get(position).getTitle());

            //Underline HashTags -- To identify Mentioned user name; use this "@([A-Za-z0-9_-]+)"
            SpannableString hashtagintitle = new SpannableString(imageAndTexts1.get(position).getTitle());
            Matcher matcher = Pattern.compile("#([A-Za-z0-9_-]+)").matcher(hashtagintitle);
            while (matcher.find())
            {
                hashtagintitle.setSpan(new ForegroundColorSpan(Color.BLUE), matcher.start(), matcher.end(), 0);                 
            }
            textView.setText(hashtagintitle);

            timeFeedText.setText(imageAndTexts1.get(position).getPubDate());

            //Underline Date
            /*SpannableString content = new SpannableString(imageAndTexts1.get(position).getPubDate());
            content.setSpan(new UnderlineSpan(), 0, 13, 0);
            timeFeedText.setText(content);*/

            if (imageAndTexts1.get(position).getImgLink() != null) {

                URL feedImage = new URL(imageAndTexts1.get(position)
                        .getImgLink().toString());
                if (!feedImage.toString().equalsIgnoreCase("null")) {
                    HttpURLConnection conn = (HttpURLConnection) feedImage
                            .openConnection();
                    InputStream is = conn.getInputStream();
                    Bitmap img = BitmapFactory.decodeStream(is);
                    imageView.setImageBitmap(img);
                } else {
                    imageView.setBackgroundResource(R.drawable.rss_tab_tweets);
                }
            }

            //Share Button
            Button Button1= (Button)  rowView.findViewById(R.id.sharebutton);
            Button1.setOnClickListener(new OnClickListener() 
            { 
                   @Override
                   public void onClick(View v) 
                   {
                        //Share Data
                        String shareBody = imageAndTexts1.get(position).getDescription();
                        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
                        sharingIntent.setType("text/plain");
                        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here");
                        sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
                        context.startActivity(Intent.createChooser(sharingIntent, shareBody));
                        //Share Data ends
                   }    
            });
            //Share Button ends

            //OpenWith Button
            Button Button2= (Button)  rowView.findViewById(R.id.openwith);
            Button2.setOnClickListener(new OnClickListener() 
            { 
                   @Override
                   public void onClick(View v) 
                   {
                        //OpenWith Data
                        Intent i = new Intent(Intent.ACTION_VIEW);
                        // We have to set data for our new Intent
                        i.setData(Uri.parse(imageAndTexts1.get(position).getLink()));
                        // And start activity with our Intent
                        context.startActivity(i);
                        //OpenWith Data ends
                   }    
            });
            //OpenWith Button ends

        } catch (MalformedURLException e) {

        } catch (IOException e) {

        }   
        return rowView;    
    }    
}

TwitterFeeds.java

public class TwitterFeeds extends Activity {

    /** Called when the activity is first created. */

    ListView _rssFeedListView;
    List<JSONObject> jobs;
    List<RssFeedStructure> rssStr;
    private TwitterAdapter _adapter;
    TextView textview;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);
        _rssFeedListView = (ListView) findViewById(R.id.rssfeed_listview);
        textview = (TextView) findViewById(R.id.loading);
        RssFeedTask rssTask = new RssFeedTask();
        rssTask.execute();
    }

    public class RssFeedTask extends AsyncTask<String, Void, String> {
        // private String Content;
        private ProgressDialog Dialog;
        String response = "";

        @Override
        public void onPreExecute() {

        }

        @Override
        public String doInBackground(String... urls) {
            try {
                String feed = "https://script.google.com/macros/s/AKfycbyRHtGY0TW5WRifXwMMRDQdtseKXxrYUbTcUlx1QxvUz-aap7Q/exec?action=timeline&q=SriSri";
                XmlHandler rh = new XmlHandler();
                rssStr = rh.getLatestArticles(feed);
            } catch (Exception e) {
            }
            return response;

        }

        @Override
        public void onPostExecute(String result) {

            if (rssStr != null) {
                _adapter = new TwitterAdapter(TwitterFeeds.this, rssStr);
                _rssFeedListView.setAdapter(_adapter);
                textview.setVisibility(View.INVISIBLE);

                _rssFeedListView.setOnItemClickListener(new OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                        //Toast.makeText(getBaseContext(), "TwitterFeeds", Toast.LENGTH_LONG).show();
                        // TODO Auto-generated method stub

                    }
                });
            }


        }

    }

}

RssFeedStructure.java

public class RssFeedStructure {

    // private long articleId;
    // private long feedId;
    private String title;
    private String description;
    private String imgLink;
    private String pubDate;
    private String link;
    private String published;
    private String content;
    private URL url;
    private String encodedContent;

    /*
     * public long getArticleId() { return articleId; }
     * 
     * public void setArticleId(long articleId) { this.articleId = articleId; }
     * 
     * public long getFeedId() { return feedId; }
     * 
     * 
     * public void setFeedId(long feedId) { this.feedId = feedId; }
     */

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {

        String noHTMLStringtitle = title.replaceAll("\\<.*?>", "");
        String replaceampersandtitle = noHTMLStringtitle.replace("&amp;", "&");
        String yesHTMLStringtitle = Html.fromHtml(replaceampersandtitle)
                .toString();
        this.title = yesHTMLStringtitle;

    }

    public URL getUrl() {
        return url;
    }

    public void setUrl(URL url) {
        this.url = url;
    }

    public void setDescription(String description) {
        String noHTMLStringDes = description.replaceAll("\\<.*?>", "");
        String replaceampersand = noHTMLStringDes.replace("&amp;", "&");
        String yesHTMLStringDes = Html.fromHtml(replaceampersand).toString();
        this.description = yesHTMLStringDes;

        // Link to understand unicode characters -
        // http://bohemianalps.com/tools/characters/?faveAlph=frac14,frac12,frac34,copy,reg,trade,laquo,raquo&faveNum=171,187,40,41,8216,8217,8220,8221,169,174,64,8482,x2122,8211,8212,225,233,241

    }

    public String getDescription() {
        return description;
    }

    public void setPubDate(String pubDate) {
        this.pubDate = pubDate;
    }

    public String getPubDate() {
        return pubDate;
    }

    public void setEncodedContent(String encodedContent) {
        // this.encodedContent = encodedContent;
        // String noHTMLString = encodedContent.replaceAll("\\<.*?>","");
        // String replaceampersand = noHTMLString.replace("&amp;", "&");
        // String yesHTMLString= Html.fromHtml(replaceampersand).toString();
        // this.encodedContent = yesHTMLString;
        // Link to understand unicode characters -
        // http://bohemianalps.com/tools/characters/?faveAlph=frac14,frac12,frac34,copy,reg,trade,laquo,raquo&faveNum=171,187,40,41,8216,8217,8220,8221,169,174,64,8482,x2122,8211,8212,225,233,241

        /*if (encodedContent.contains("<img ")){
            String img = encodedContent.substring(encodedContent.indexOf("<img "));
            String cleanUp = img.substring(0, img.indexOf(">")+1);
            img = img.substring(img.indexOf("src=") + 5);
            int indexOf = img.indexOf("'");
            if (indexOf==-1){
            indexOf = img.indexOf("\"");
            }
            img = img.substring(0, indexOf);

            this.encodedContent = this.encodedContent.replace(cleanUp, "");

        }*/
        String removeimages = encodedContent.replaceAll("<img.+?>", "");
        this.encodedContent = removeimages;
    }

    public String getEncodedContent() {
        return encodedContent;
    }

    public void setImgLink(String imgLink) {
        this.imgLink = imgLink;
    }

    public String getImgLink() {
        return imgLink;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getLink() {
        return link;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public void setPublished(String published) {
        this.published = published;
    }

    public String getPublished() {
        return published;
    }

}

**PACKAGE TWO

ListProvider.java

public class ListProvider implements RemoteViewsFactory {
    private ArrayList<ListItem> listItemList = new ArrayList<ListItem>();
    private Context context = null;
    private int appWidgetId;
    static String passtitletowidget;
    List<RssFeedStructure> imageAndTexts1 = null;

    public ListProvider(Context context, Intent intent) {
        this.context = context;
        appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

        populateListItem();
    }

    private void populateListItem() {
        //for (int i = 0; i < 10; i++) {
            ListItem listItem = new ListItem();

            listItem.heading = "passtitletowidget";  //PUT VALUE
            listItem.content = "This is the content of the app widget listview.Nice content though";
            listItemList.add(listItem);
        //}
    }

    @Override
    public int getCount() {
        return listItemList.size();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    /*
     *Similar to getView of Adapter where instead of View
     *we return RemoteViews 
     * 
     */
    @Override
    public RemoteViews getViewAt(int position) {
        final RemoteViews remoteView = new RemoteViews(
                context.getPackageName(), R.layout.list_row);
        ListItem listItem = listItemList.get(position);

        remoteView.setTextViewText(R.id.heading, listItem.heading);
        remoteView.setTextViewText(R.id.content, listItem.content);

        return remoteView;
    }

    @Override
    public RemoteViews getLoadingView() {
        return null;
    }

    @Override
    public int getViewTypeCount() {
        return 1;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public void onCreate() {
    }

    @Override
    public void onDataSetChanged() {
    }

    @Override
    public void onDestroy() {
    }   
}

ListItem.java

public class ListItem {
    public String heading, content;
}

WidgetProvider.java

public class WidgetProvider extends AppWidgetProvider {

    /* 
     * this method is called every 30 mins as specified on widgetinfo.xml
     * this method is also called on every phone reboot
     */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        final int N = appWidgetIds.length;
        /*int[] appWidgetIds holds ids of multiple instance of your widget
         * meaning you are placing more than one widgets on your homescreen*/
        for (int i = 0; i < N; ++i) {
            RemoteViews remoteViews = updateWidgetListView(context,
                    appWidgetIds[i]);
            appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

    private RemoteViews updateWidgetListView(Context context, int appWidgetId) {

        //which layout to show on widget
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.widget_layout);

        //RemoteViews Service needed to provide adapter for ListView
        Intent svcIntent = new Intent(context, WidgetService.class);
        //passing app widget id to that RemoteViews Service
        svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        //setting a unique Uri to the intent
        //don't know its purpose to me right now
        svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
        //setting adapter to listview of the widget
        remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget,svcIntent);
        //setting an empty view in case of no data
        remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view);
        return remoteViews;
    }

}

WidgetService.java

public class WidgetService extends RemoteViewsService {
    /*
     * So pretty simple just defining the Adapter of the listview
     * here Adapter is ListProvider
     * */

    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        int appWidgetId = intent.getIntExtra(
                AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

        return (new ListProvider(this.getApplicationContext(), intent));
    }

}

No correct solution

OTHER TIPS

You need to have TwitterAdapter instance in ListProvider file. While initializing ListProvider, you can send TwitterAdapter instance as parameter to the ListProvider contructor.

Probably you must be having a main activity where you initialize both TwitterAdapter & ListProvider.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top