Я очень новичок в Android и задал задачу, чтобы отобразить список жанров из API У меня нет подсказки относительно того, что происходит. Я успешно реализовал обычный список с жестко кодированными данными. Но теперь мне нужно использовать службы REST и подключаться к сети и отображать данные в списке.Android-дисплей JSONArray в Listview с данными из API (сайт)
Мой XML является очень простой, просто ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lstView"
android:layout_height="wrap_content"
android:layout_width="match_parent">
</ListView>
</LinearLayout>
После этого, у меня есть класс. В настоящее время у меня две (2) ошибки. Первый пытается получить строку, возвращенную из API, в JSONArray. Второй просто решил произойти, скажем, символ R не может быть разрешен. Не знаю, как это произошло.
Во всяком случае, вот мой код:
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class Genre extends Activity {
ListView listView;
private static final String DEBUG_TAG = "HttpExample";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
listView = (ListView) findViewById(R.id.lstView);
ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
String result=null;
try {
result = downloadUrl();
}catch(IOException e)
{}
ArrayList<String> lstData = new ArrayList<String>();
JSONArray jarray = (JSONObject)result; //ERROR HERE
try {
if (jarray != null) {
for (int i = 0; i < jarray.length(); i++) {
lstData.add(jarray.get(i).toString());
}
}
}catch(JSONException j)
{}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, lstData);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int itemPosition = position;
String itemValue = (String) listView.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), "Position :" + itemPosition + " ListItem :" + itemValue, Toast.LENGTH_LONG).show();
}
});
}
private String downloadUrl() throws IOException{
InputStream is = null;
int len = 500;
try{
URL url = new URL("website here");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG,"The response is: " + response);
is = conn.getInputStream();
String contentAsString = readIt(is, len);
return contentAsString;
}finally{
if(is != null){
is.close();
}
}
}
public String readIt(InputStream stream, int len) throws IOException{
Reader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}
}
я прокомментировал раздел, который дает мне ошибки. Символ R - это еще одна история. Если бы я мог просто заставить приложение успешно вернуться и преобразовать JSONArray, это было бы здорово.
Я скопировал и вставлял большинство, если не все, код с различных сайтов и сам StackOverflow, который искал ответ.
данные JSON я получаю:
{ "жанры": [{ "ID": 28, "имя": "Действие"}, { "ID": 12, "имя": "Приключение"}, { "идентификатор": 16, "название": "Анимация"}, { "идентификатор": 35, "название": "Комедия"}, { "идентификатор": 80, "название": "Преступление "}, {" ID ": 99," имя ":" Документальный фильм "}, {" ID ": 18," имя ":" Драма "}, {" ID ": 10751," имя ":" Семья "} , { "ID": 14, "имя": "фантазия"}, { "ID": 10769, "имя": "Иностранные"}, { "ID": 36, "имя": "История"}, { "идентификатор": 27, "имя": "Ужас"}, { "ID": 10402, "имя": "Музыка"}, { "ID": 9648, "имя": "Тайна"}, { "идентификатор ": 10749," name ":" Romance "}, {" id ": 878," name ":" Science Fiction "}, {" id ": 10770," name ":" TV Movie "}, {" id ": 53," name ":" Thriller "}, {" id ": 10752," name ":" War "}, {" id ": 37," name ":" Western "}]}
Я бы хотел отобразить это имя на данный момент, но я могу пойти как для ID, так и для имени. Помощь была бы очень признательна. Спасибо Кроме того, пожалуйста, комментарий, если вам нужно больше данных
только имена в виде списка? –
'JSONArray jarray = (JSONObject) result; // ОШИБКА ЗДЕСЬ', правда? – Blackbelt
Как вы можете придать jsonobject ваш json-результат, а затем присвоить его jsonarray – Pankaj