将API数据解析为TextView

时间:2017-09-11 03:36:08

标签: java android textview

我有一个API链接,其中包含一个名为title的json元素,我试图将该值存储到textview中。这是我到目前为止在我的主要活动代码中应该显示包含的字符串:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    JSONObject jObject;
    try {
        jObject = new JSONObject("https://chex-triplebyte.herokuapp.com/api/cats?page=0");
        String mResponse = jObject.getString("title");
        TextView t = (TextView) findViewById(R.id.title_image);
        t.setText(mResponse);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我提供的API链接有效,因此您可以看到我想要获取的值标题。

3 个答案:

答案 0 :(得分:2)

试试这个:

  TextView t = (TextView) findViewById(R.id.title_image);
try {

                url = new URL("https://chex-triplebyte.herokuapp.com/api/cats?page=0");

                urlConnection = (HttpURLConnection) url
                        .openConnection();
                urlConnection.connect();

                InputStream in = urlConnection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(in));
                //InputStreamReader isw = new InputStreamReader(in);
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }

                String JsonResponse= buffer.toString();

                JSONObject jsonobj = new JSONObject(JsonResponse);
                JSONArray jarray = jsono.getJSONArray("jsontitle");

            for (int i = 0; i < jarray.length(); i++) {
                JSONObject object = jarray.getJSONObject(i);


                 t.setText(object.getString("title"));


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

但你必须确保你有一个正确的json格式:

{jsontitle:[{"title":"Space Keybaord Cat","timestamp":"2017-09-11T04:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/space.jpg","description":"In space, no one can hear you purr."},{"title":"Jiji","timestamp":"2017-09-11T03:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/jiji.png","description":"You'd think they'd never seen a girl and a cat on a broom before"},{"title":"Limecat","timestamp":"2017-09-11T02:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/lime.jpg","description":"Destroyer of Clockspider and his evil followers, Limecat is the one true god."},{"title":"Astronaut Cat","timestamp":"2017-09-11T01:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/astronaut.jpg","description":"Houston, we have a purroblem"},{"title":"Grumpy Cat","timestamp":"2017-09-11T00:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/grumpy.jpg","description":"Queen of the RBF"},{"title":"Soviet cat","timestamp":"2017-09-10T23:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/soviet.jpg","description":"In soviet Russia cat pets you!"},{"title":"Serious Business Cat","timestamp":"2017-09-10T22:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/serious.jpg","description":"SRSLY GUISE"},{"title":"Sophisticated Cat","timestamp":"2017-09-10T21:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/sophisticated.PNG","description":"I should buy a boat"},{"title":"Shironeko","timestamp":"2017-09-10T20:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/shironeko.png","description":"The zen master kitty"},{"title":"Puss in Boots","timestamp":"2017-09-10T19:00:04Z","image_url":"https://triplebyte-cats.s3.amazonaws.com/puss.jpg","description":"Don't you dare do the litter box on me!"}]}

答案 1 :(得分:1)

首先需要先进行网络调用,然后再将其解析为JSONArray,然后从JSON获取标题

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView t = (TextView) findViewById(R.id.title_image);
    RequestQueue queue = Volley.newRequestQueue(this);
    String url ="https://chex-triplebyte.herokuapp.com/api/cats?page=0";

   // Request a string response from the provided URL.
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
      @Override
      public void onResponse(String response) {

           JSONArray jArray;
           try {
               jArray = new JSONArray(response);
               JSONObject jObject = jArray.getJSONObject(0);
               String mResponse = jObject.getString("title");

               t.setText(mResponse);
           } catch (JSONException e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
           }
      }
      }, new Response.ErrorListener() {
     @Override
       public void onErrorResponse(VolleyError error) {

      }
   });
   // Add the request to the RequestQueue.
   queue.add(stringRequest);


}

但这只会显示响应数组中的第一个标题 如果要显示附加的所有标题,则可以循环遍历数组

    JSONArray jArray;
    try {
        jArray = new JSONArray(response);
        String mResponse = "";
        for(int i=0 ;i<jArray.length();i++){
            JSONObject jObject = jArray.getJSONObject(i);
            mResponse += jObject.getString("title")+" ";
        }
        t.setText(mResponse);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
   }

要使用排球,您需要将其包含在app

的build.gradle中的依赖项中
dependencies {
.
.
compile 'com.android.volley:volley:1.0.0'
.
.
}

答案 2 :(得分:1)

试试这个......

<强> MainActivity.java

.user.ini

<强> CustomListViewAdapter.java

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

private String TAG = MainActivity.class.getSimpleName();
private ListView listView;
List<RowItem> rowItems;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);

    rowItems = new ArrayList<RowItem>();
    listView = (ListView) findViewById(R.id.item_list);

    new GetList().execute();
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
    Toast toast = Toast.makeText(getApplicationContext(),
            "Item " + (position + 1) + ": " + rowItems.get(position),
            Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
    toast.show();
}

class GetList extends AsyncTask<Void, Void, List<RowItem>> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Toast.makeText(MainActivity.this, "Json Data is downloading", Toast.LENGTH_LONG).show();
    }


    @Override
    protected List<RowItem> doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();
        // Making a request to url and getting response
        String url = "https://chex-triplebyte.herokuapp.com/api/cats?page=0";
        String jsonStr = sh.makeServiceCall(url);

        Log.e(TAG, "Response from url: " + jsonStr);
        if (jsonStr != null) {
            try {
                JSONArray list = new JSONArray(jsonStr);

                for (int i = 0; i < list.length(); i++) {
                    JSONObject c = list.getJSONObject(i);
                    String title = c.getString("title");
                    String timestamp = c.getString("timestamp");
                    String image_url = c.getString("image_url");
                    String description = c.getString("description");

                    RowItem item = new RowItem();
                    item.setTitle(title);
                    item.setTimestamp(timestamp);
                    item.setImageUrl(image_url);
                    item.setDescription(description);

                    rowItems.add(item);
                }
            } catch (final JSONException e) {
                Log.e(TAG, "Json parsing error: " + e.getMessage());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Json parsing error: " + e.getMessage(),
                                Toast.LENGTH_LONG).show();
                    }
                });

            }

        } else {
            Log.e(TAG, "Couldn't get json from server.");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "Couldn't get json from server. Check LogCat for possible errors!",
                            Toast.LENGTH_LONG).show();
                }
            });
        }

        return rowItems;
    }

    @Override
    protected void onPostExecute(List<RowItem> rowItems) {
        super.onPostExecute(rowItems);
        if (rowItems != null) {
            CustomListViewAdapter adapter = new CustomListViewAdapter(MainActivity.this, R.layout.list_item, rowItems);
            listView.setAdapter(adapter);
        }
      }
    }
  }

<强> RowItem.java

public class CustomListViewAdapter extends ArrayAdapter<RowItem> {

private Context context;

public CustomListViewAdapter(Context context, int resourceId,
                             List<RowItem> items) {
    super(context, resourceId, items);
    this.context = context;
}

/*private view holder class*/
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
    TextView txtDesc;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.txtDesc = (TextView) convertView.findViewById(R.id.description);
        holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
        holder.imageView = (ImageView) convertView.findViewById(R.id.preview);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();

    holder.txtDesc.setText(rowItem.getDescription());
    holder.txtTitle.setText(rowItem.getTitle());
    String url = rowItem.getImageUrl();

    DownloadImageTask downloadImageTask = new DownloadImageTask(holder.imageView);
    downloadImageTask.execute(url);
    return convertView;
}


private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
 }
}

<强> list_item.xml

public class RowItem {

private String title;
private String timestamp;
private String imageUrl;
private String description;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getTimestamp() {
    return timestamp;
}

public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;
}

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}
}

<强> HttpHandler.java

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout2">

<ImageView
    android:id="@+id/preview"
    android:layout_width="80dp"
    android:layout_height="80dp"
    app:srcCompat="@mipmap/ic_launcher"
    android:contentDescription="@string/app_name" />

<TextView
    android:id="@+id/title"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="16dp"
    android:text="@string/app_name"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/preview"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/description"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:text="@string/app_name"
    app:layout_constraintBottom_toBottomOf="@+id/preview"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/preview"
    app:layout_constraintTop_toBottomOf="@+id/title" />
</android.support.constraint.ConstraintLayout>

<强> activity_list.xml

public class HttpHandler {

private static final String TAG = HttpHandler.class.getSimpleName();

public HttpHandler() {
}

public String makeServiceCall(String reqUrl) {
    String response = null;
    try {
        URL url = new URL(reqUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        // read the response
        InputStream in = new BufferedInputStream(conn.getInputStream());
        response = convertStreamToString(in);
    } catch (MalformedURLException e) {
        Log.e(TAG, "MalformedURLException: " + e.getMessage());
    } catch (ProtocolException e) {
        Log.e(TAG, "ProtocolException: " + e.getMessage());
    } catch (IOException e) {
        Log.e(TAG, "IOException: " + e.getMessage());
    } catch (Exception e) {
        Log.e(TAG, "Exception: " + e.getMessage());
    }
    return response;
}

private String convertStreamToString(InputStream is) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line).append('\n');
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return sb.toString();
}
 }

注意:

  1. item_list.xml已实施ConstraintLayout
  2. 结果:

    Result