Получение исключения NullPointerException при выполнении разных URL-адресов httpget и загрузке результата в том же listview?

#android #listview #android-listview

#Android #listview #android-listview

Вопрос:

Во фрагменте я выполняю AsyncTask для извлечения данных JSON из Интернета в onCreateView() и загрузки данных в ListView.

В меню NavigationDrawer у меня есть несколько категорий. При нажатии я снова запускаю другой URL-адрес и загружаю данные в тот же ListView, который я использовал для фрагмента. Пока здесь рабочий процесс в порядке.

Проблема возникает здесь:
Я выбираю категорию из NavigationDrawer, перед отображением данных, снова, когда я выбираю другую категорию, я получаю исключение NullPointerException для моего ListView.

Вот мой код для фрагмента:

 private ListView feedListView = null;
private ArrayList<FeedItem> listitem = null;

public class Category extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    rootView = inflater.inflate(R.layout.fragment_category, container, false);
    feedListView = (ListView) rootView.findViewById(R.id.list);

    category_name = getArguments().getString("CATEGORY"); 
    if(isConnection())
    {
        new GetData().execute("URL");
    }
    else
    {
        Intent in1 = new Intent(getActivity(),NetworkConn.class);
        in1.putExtra("category", category_name);
    startActivity(in1);
    }

    return rootView;
    }
}

public class GetData extends AsyncTask<String,Void,String>
{
    @Override
    protected String doInBackground(String... params) {  
        JSONObject json = getJSONFromUrl(url);
        parseJson(json);
    }

    @Override
    protected void onPostExecute(String result) {   
        if (null != listitem) {     
             updateList();
        }
    }
}

public void updateList() {

    // Here I am getting that exception

    => CustomListViewAdapter adapter = new CustomListViewAdapter(getActivity(), listitem);  
    feedListView.setVisibility(View.VISIBLE);

    feedListView.setAdapter(adapter);

    feedListView.setOnItemClickListener(new OnItemClickListener() {});

}

public void parseJson(JSONObject json) {
    try {

        // parsing json object
        if (json.getString("status").equalsIgnoreCase("ok")) {
            String pages = json.getString("pages");
            System.out.println("No of pages: " pages);
            JSONArray posts = json.getJSONArray("posts");


            listitem = new ArrayList<FeedItem>();
            for (int i = 0; i < posts.length(); i  ) 
            {
                JSONObject post = (JSONObject) posts.getJSONObject(i);
                JSONObject author = post.getJSONObject("author");
                System.out.println(author.get("name"));
                FeedItem item = new FeedItem();
                String title = post.getString("title");
                item.setTitle(Html.fromHtml(title).toString());
                item.setDate(post.getString("date"));
                item.setId(post.getString("id"));
                item.setUrl(post.getString("url"));
                item.setContent(post.getString("content"));

                JSONArray attachments = post.getJSONArray("attachments");

                if (null != attachments amp;amp; attachments.length() > 0) {
                    JSONObject attachment = attachments.getJSONObject(0);
                    if (attachment != null)
                    item.setAttachmentUrl(attachment.getString("url"));
                }

                listitem.add(item);

            }

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
  

И мой CustomListViewAdapter:

 public class CustomListViewAdapter extends BaseAdapter {

private ArrayList<FeedItem> listData;

private LayoutInflater layoutInflater;


public ImageLoader imageLoader;
DisplayImageOptions op;

private Context mcontext;

public CustomListViewAdapter(Context context, ArrayList<FeedItem> listData) {
    this.listData = listData;
    this.mcontext = context;

    // Here I am getting the exception

    => layoutInflater = (LayoutInflater) this.mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    imageLoader =  ImageLoader.getInstance();

}

    ...
    ...

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.list_item,parent, false);
        holder = new ViewHolder();
        holder.headlineView = (TextView) convertView.findViewById(R.id.title);      
        holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
        holder.reportedDateView = (TextView) convertView.findViewById(R.id.postdate);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    FeedItem newsItem = (FeedItem) listData.get(position);
    holder.headlineView.setText(newsItem.getTitle());
    holder.reportedDateView.setText(newsItem.getDate());
    String url = newsItem.getAttachmentUrl();

    if (holder.imageView != null) {         
        imageLoader.displayImage(url, holder.imageView,op);         
    }


    return convertView;
}
}
  

И R.макет.fragment_category:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ProgressBar
    android:id="@ id/progressbar"
    style="?android:progressBarStyleLargeInverse"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_gravity="center" />

<ListView
    android:id="@ id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp" 
    android:background="#fff"/>

</RelativeLayout>
  

Пожалуйста, дайте мне знать, где я ошибаюсь.

Вот мой LogCat:

 06-18 12:03:18.392: E/AndroidRuntime(27092): FATAL EXCEPTION: main
06-18 12:03:18.392: E/AndroidRuntime(27092): java.lang.NullPointerException
06-18 12:03:18.392: E/AndroidRuntime(27092):    at com.rquad.theindianpanorama.CustomListViewAdapter.<init>(CustomListViewAdapter.java:31)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at com.rquad.theindianpanorama.Category.updateList(Category.java:138)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at com.rquad.theindianpanorama.Category$GetData.onPostExecute(Category.java:126)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at com.rquad.theindianpanorama.Category$GetData.onPostExecute(Category.java:1)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at android.os.AsyncTask.finish(AsyncTask.java:631)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at android.os.Looper.loop(Looper.java:213)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at android.app.ActivityThread.main(ActivityThread.java:5225)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at java.lang.reflect.Method.invokeNative(Native Method)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at java.lang.reflect.Method.invoke(Method.java:525)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-18 12:03:18.392: E/AndroidRuntime(27092):    at dalvik.system.NativeStart.main(Native Method)
06-18 12:03:18.883: D/dalvikvm(27092): GC_FOR_ALLOC freed 4822K, 48% free 5922K/11256K, paused 38ms, total 38ms
  

Комментарии:

1. Пожалуйста, добавьте logcat.

2. Попробуйте получить раздуватель с from() помощью метода: layoutInflater = LayoutInflater.from(mcontext); в вашем пользовательском адаптере.

3. Я пробовал это. Но никаких улучшений.

4. Можете ли вы проверить с помощью отладчика, что context то, что вы передаете своему пользовательскому адаптеру, не равно null?

5. В контексте указано имя моего пакета с классом.