ANDROID - 如何使用自定义适配器从API Web服务添加jsonObject?

时间:2016-12-07 05:49:38

标签: android

有没有办法使用从特定链接获得master* $ pip show requests [21:45:05] Name: requests Version: 2.12.3 Summary: Python HTTP for Humans. Home-page: http://python-requests.org Author: Kenneth Reitz Author-email: me@kennethreitz.com License: Apache 2.0 Location: /usr/local/lib/python2.7/site-packages 的自定义适配器?

当我使用我的代码运行我的应用程序时出现错误,我该怎么办?

我试图找到一种方法,但是这些例子过于吝啬,这就是我需要帮助的原因,

我尝试过这段代码:

jsonArray

Pertanyaan.java

public class Pertanyaan { private float ratingStar; private String ask; Pertanyaan(int ratingStar, String ask) { this.ratingStar = ratingStar; this.ask = ask; } float getRatingStar() { return 0; } void setRatingStar(float ratingStar) { this.ratingStar = ratingStar; } public String getAsk() { return ask; } public void setAsk(String ask) { this.ask = ask; } }

PertanyaanAdapter.java

class PertanyaanAdapter extends ArrayAdapter<Pertanyaan> { private AppCompatActivity activity; private List<Pertanyaan> movieList; PertanyaanAdapter(AppCompatActivity context, int resource, List<Pertanyaan> objects) { super(context, resource, objects); this.activity = context; this.movieList = objects; } @Override public Pertanyaan getItem(int position) { return movieList.get(position); } @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { ViewHolder holder; LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = inflater.inflate(R.layout.item_listview, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); //holder.ratingBar.getTag(position); } holder.ratingBar.setOnRatingBarChangeListener(onRatingChangedListener(position)); holder.ratingBar.setTag(position); holder.ratingBar.setRating(getItem(position).getRatingStar()); holder.movieName.setText(getItem(position).getAsk()); return convertView; } private RatingBar.OnRatingBarChangeListener onRatingChangedListener(final int position) { return new RatingBar.OnRatingBarChangeListener() { @Override public void onRatingChanged(RatingBar ratingBar, float v, boolean b) { Pertanyaan item = getItem(position); assert item != null; item.setRatingStar(v); Log.i("Adapter", "star: " + v); } }; } private static class ViewHolder { private RatingBar ratingBar; private TextView movieName; ViewHolder(View view) { ratingBar = (RatingBar) view.findViewById(R.id.rate_img); movieName = (TextView) view.findViewById(R.id.text); } } }

MainActivity.java

编辑:

logcat错误:

public class MainActivity extends AppCompatActivity {

    ListView listView;
    ArrayList<Pertanyaan> listPertanyaan;
    ArrayAdapter<Pertanyaan> adapter2;
    ProgressDialog pDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView)findViewById(R.id.list_view);
        getpertanyaan get= new getpertanyaan();
        get.execute();
        adapter2 = new PertanyaanAdapter(this, R.layout.item_listview, listPertanyaan);
        listView.setOnItemClickListener(onItemClickListener());
    }

    private AdapterView.OnItemClickListener onItemClickListener() {
}

    private class getpertanyaan extends AsyncTask<Void, Void, Integer> {
        ArrayList<Pertanyaan> list;
        protected void onPreExecute() {
            pDialog=new ProgressDialog(MainActivity.this);
            pDialog.setTitle("Nama Dosen");
            pDialog.setMessage("Menampilkan nama dosen... Mohon tunggu...!");
            pDialog.setCancelable(false);
            pDialog.show();
            super.onPreExecute();
            list = new ArrayList<>();
        }

        @Override
        protected Integer doInBackground(Void... params) {
            InputStream is = null;
            String result = "";

            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://flix.16mb.com/send_data.php");
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                // Get our response as a String.
                is = entity.getContent();
            } catch (IOException e) {
                e.printStackTrace();
            }

            //convert response to string
            try {
                BufferedReader reader = null;
                if (is != null) {
                    reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
                }
                String line;
                if (reader != null) {
                    while ((line = reader.readLine()) != null) {
                        result += line;
                    }
                }
                if (is != null) {
                    is.close();
                }
                //result=sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
            // parse json data
            try {
                JSONArray jArray = new JSONArray(result);
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject jsonObject = jArray.getJSONObject(i);
                    list.add(new Pertanyaan(0,jsonObject.getString("ask")));
                }

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

        protected void onPostExecute(Integer result) {
            if (pDialog.isShowing())
                pDialog.dismiss();
            listPertanyaan.addAll(list);
            adapter2.notifyDataSetChanged();
        }
    }

1 个答案:

答案 0 :(得分:0)

您的问题是您的ArrayList未初始化。它崩溃了:

protected void onPostExecute(Integer result) {
            if (pDialog.isShowing())
                pDialog.dismiss();
            listPertanyaan.addAll(list); // CRASH!
            adapter2.notifyDataSetChanged();
        }

要解释更多内容,就像我们在评论中所讨论的那样,您所做的就是在ArrayList中创建新的asyncTask

 private class getpertanyaan extends AsyncTask<Void, Void, Integer> {
        ArrayList<Pertanyaan> list; //NEW ARRAYLIST
        protected void onPreExecute() {
            pDialog=new ProgressDialog(MainActivity.this);
            pDialog.setTitle("Nama Dosen");
            pDialog.setMessage("Menampilkan nama dosen... Mohon tunggu...!");
            pDialog.setCancelable(false);
            pDialog.show();
            super.onPreExecute();
            list = new ArrayList<>();//NEW ARRAYLIST INITIALIZING
        }

但仍未初始化listPertanyaan。您必须使用新创建的arrayList,如:

list.addAll(list);

在您的onPostExecute()中,或者您必须在

之前初始化listPertanyaan
listPertanyaan = new ArrayList<Pertanyaan>();

修改

对于第二个问题,在填充arrayList之后,应初始化适配器并将其设置为onPostExecute()中的listView。它应该看起来像:

protected void onPostExecute(Integer result) {
                if (pDialog.isShowing())
                    pDialog.dismiss();
                listPertanyaan.addAll(list); 
                adapter2 = new PertanyaanAdapter(this, R.layout.item_listview, listPertanyaan);
                listView.setAdapter(adapter2);
            }