使用带有asynctask的片段和通知数据集更改

时间:2014-10-28 08:21:28

标签: android json android-fragments android-asynctask android-volley

您好我想从我的服务器下载一个json文件并将此json添加到列表视图我使用asyncktask方法和列表适配器处理片段 但是我得到了这个错误

    10-27 14:45:30.385: E/AndroidRuntime(2074): FATAL EXCEPTION: main
10-27 14:45:30.385: E/AndroidRuntime(2074): java.lang.NullPointerException
10-27 14:45:30.385: E/AndroidRuntime(2074):     at com.mihanServer.Fragments.NewsFragment$JsonReader.onPostExecute(NewsFragment.java:89)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at com.mihanServer.Fragments.NewsFragment$JsonReader.onPostExecute(NewsFragment.java:1)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at android.os.AsyncTask.finish(AsyncTask.java:631)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at android.os.Looper.loop(Looper.java:137)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at android.app.ActivityThread.main(ActivityThread.java:5041)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at java.lang.reflect.Method.invokeNative(Native Method)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at java.lang.reflect.Method.invoke(Method.java:511)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-27 14:45:30.385: E/AndroidRuntime(2074):     at dalvik.system.NativeStart.main(Native Method)

这是我的片段代码

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.mihanServer.sedasema.CustomListAdapter;
import com.mihanServer.sedasema.JSONParser;
import com.mihanServer.sedasema.MainActivity;
import com.mihanServer.sedasema.News;
import com.mihanServer.sedasema.R;

import android.app.ProgressDialog;
import android.database.DataSetObservable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView.FindListener;
import android.widget.ListView;

public class NewsFragment extends Fragment {
    private static final String url = "http://192.168.1.6/web/app_dev.php/news/list";
    private List<News> newsList = new ArrayList<News>();
    private ListView listView;
    private CustomListAdapter adapter;
    private JSONArray jArray;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.news , container, false);
        listView = (ListView)rootView.findViewById(R.id.list);
        try
        {
        adapter = new CustomListAdapter(getActivity(),newsList);
        listView.setAdapter(adapter);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        new JsonReader().execute();
        return rootView;
    }
    public class JsonReader extends AsyncTask<String, String, JSONObject>{
        private ProgressDialog pDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Getting Data ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
        @Override
        protected JSONObject doInBackground(String... args) {
            JSONParser jParser = new JSONParser();
            JSONObject json = jParser.getJSONFromUrl(url);
            return json;
        }
        @Override
        protected void onPostExecute(JSONObject json) {
            pDialog.dismiss();
            try {
                // Getting JSON Array
                jArray = json.getJSONArray("news");
                for (int i = 0; i < jArray.length(); i++) {
                    try {
                        News news = new News(); 
                        JSONObject obj = jArray.getJSONObject(i);
                        news.setNewsTitle(obj.getString("title"));
                        news.setNewsThumbnailUrl(obj.getString("thumbnail"));
                        news.setNewsReleaseTime( obj.getString("created"));
                        news.setNewsBody(obj.getString("body"));
                        news.setNewsId(obj.getInt("id"));
                        // adding app to app array
                        newsList.add(news);
                    } 
                    catch (JSONException e) {
                        e.printStackTrace();
                    }

                    adapter.notifyDataSetChanged();


                    }

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

    }
}

在行通知数据集更改后,我收到错误。

这是我的列表适配器代码

import com.mihanServer.sedasema.R;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;

import com.mihanServer.sedasema.MainActivity;
import com.mihanServer.sedasema.AppController;
import com.mihanServer.sedasema.News;

public class CustomListAdapter extends BaseAdapter {
    private final Activity actitity;
    private LayoutInflater inflater;
    private List<News> newsItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();
    News news;

    public CustomListAdapter(Activity activity,List<News> newsItems) {
        this.newsItems = newsItems;
        this.actitity =activity;
         imageLoader = new AppController().getImageLoader();
    }

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

    @Override
    public Object getItem(int location) {
        return newsItems.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final Context context = parent.getContext();
         inflater = (LayoutInflater)context.getSystemService
                  (Context.LAYOUT_INFLATER_SERVICE);
            //inflater = (LayoutInflater) activity
                //  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.news_list, null);
        //comment for image reading
        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();
        NetworkImageView newsthumbnail = (NetworkImageView) convertView
                .findViewById(R.id.news_image);
        TextView newsTitle = (TextView) convertView.findViewById(R.id.news_title);
        //TextView newsBody = (TextView) convertView.findViewById(R.id.news_body);
        TextView newsReleaseTime = (TextView) convertView.findViewById(R.id.news_release_time);


        // getting news data for the row
        news = newsItems.get(position);

        //comment for image reading
        newsthumbnail.setImageUrl(news.getNewsThumbnailUrl(), imageLoader);


        newsTitle.setText(news.getNewsTitle());


        newsReleaseTime.setText( news.getNewsReleaseTime());


        //newsBody.setText(news.getNewsBody());

        convertView.setOnClickListener(new OnClickListener() {

            //@Override
            public void onClick(View arg0) {

                news=newsItems.get(position);
                Intent intent = new Intent(actitity.getApplicationContext(),NewsDetails.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("title",news.getNewsTitle());
                intent.putExtra("body", news.getNewsBody());
                intent.putExtra("newsimage", news.getNewsThumbnailUrl());
                intent.putExtra("releasedtime", news.getNewsReleaseTime());
                actitity.getApplicationContext().startActivity(intent);

            }
        });
        return convertView;
    }

}

这是我的json解析器

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    static Socket socket = null;

    public JSONParser() {
    }
    public JSONObject getJSONFromUrl(String url) {

        try{

        //try {

            //URL urlS = new URL(url);
            try {

                  // defaultHttpClient
                  DefaultHttpClient httpClient = new DefaultHttpClient();
                  HttpGet httpGet = new HttpGet(url);
                  HttpResponse httpResponse = httpClient.execute(httpGet);
                  HttpEntity httpEntity = httpResponse.getEntity();
                  is = httpEntity.getContent();
                } catch (UnsupportedEncodingException e) {
                  e.printStackTrace();
                } catch (ClientProtocolException e) {
                  e.printStackTrace();
                } catch (IOException e) {
                  e.printStackTrace();
                }
            /*catch (UnknownHostException e) {

                e.printStackTrace();
                json = "UnknownHostException: " + e.toString();
            }*/
            //is = urlS.openStream();

        //}
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "");
            }
            is.close();
            json = sb.toString();
            //json = json.replace("&quot;", "\"");

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);


        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // return JSON String

        }/*catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            json = "IOException: " + e.toString();*/
    //  }
    finally{
            if(socket != null){
                try {
                    socket.close();
                } 
            catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            }
        return jObj;
    }
}

我也使用volley lib来下载这样的图像

http://www.androidhive.info/2014/07/android-custom-listview-with-image-and-text-using-volley/

1 个答案:

答案 0 :(得分:0)

尝试使用适配器类中的以下更改:

public class CustomListAdapter extends BaseAdapter {
    private final Activity actitity;
    private LayoutInflater inflater;
    private List<News> newsItems;
    private AQuery aQuery;
    //ImageLoader imageLoader = AppController.getInstance().getImageLoader();
    News news;

    public CustomListAdapter(Activity activity,List<News> newsItems) {
        this.newsItems = newsItems;
        this.actitity =activity;
        aQuery=new AQuery(activity);
        // imageLoader = new AppController().getImageLoader();
    }

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

    @Override
    public Object getItem(int location) {
        return newsItems.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final Context context = parent.getContext();
         inflater = (LayoutInflater)context.getSystemService
                  (Context.LAYOUT_INFLATER_SERVICE);
            //inflater = (LayoutInflater) activity
                //  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.news_list, null);
        //comment for image reading
        /*if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();*/
        NetworkImageView newsthumbnail = (NetworkImageView) convertView
                .findViewById(R.id.news_image);
        TextView newsTitle = (TextView) convertView.findViewById(R.id.news_title);
        //TextView newsBody = (TextView) convertView.findViewById(R.id.news_body);
        TextView newsReleaseTime = (TextView) convertView.findViewById(R.id.news_release_time);


        // getting news data for the row
        news = newsItems.get(position);
        if(news.getNewsThumbnailUrl().length()>0){
            aQuery.id(newsthumbnail).image(news.getNewsThumbnailUrl(),true,true);
        }else{
            newsthumbnail.setVisibility(View.GONE);
        }
        //comment for image reading
        //newsthumbnail.setImageUrl(news.getNewsThumbnailUrl(), imageLoader);



        newsTitle.setText(news.getNewsTitle());


        newsReleaseTime.setText( news.getNewsReleaseTime());


        //newsBody.setText(news.getNewsBody());

        convertView.setOnClickListener(new OnClickListener() {

            //@Override
            public void onClick(View arg0) {

                news=newsItems.get(position);
                Intent intent = new Intent(actitity.getApplicationContext(),NewsDetails.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("title",news.getNewsTitle());
                intent.putExtra("body", news.getNewsBody());
                intent.putExtra("newsimage", news.getNewsThumbnailUrl());
                intent.putExtra("releasedtime", news.getNewsReleaseTime());
                actitity.getApplicationContext().startActivity(intent);

            }
        });
        return convertView;
    }

}