我尝试在以下代码中设置适用于列表视图的设备。
public class MainActivity extends AppCompatActivity {
JSONArray jsonObject;
ArrayList<String> arrayList= new ArrayList<String>();
static ArrayList<String> articles= new ArrayList<String>();
static ArrayAdapter<String> arrayAdapter;
public class Dwnl extends AsyncTask<String,Void,String> {
@Override
protected String doInBackground(String... strings) {
try {
URL url = new URL(strings[0]);
URLConnection conn=null;
conn = (HttpURLConnection)url.openConnection();
String contents="";
InputStream in = conn.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data =reader.read();
int counter = 0;
while (data!=-1) {
contents+=(char)data;
data=reader.read();
//ounter++;
}
//contents = in.toString();
jsonObject= new JSONArray(contents);
//Log.i("Sire",String.valueOf(jsonObject.length()));
arrayList = new ArrayList<>();
//arrayList.addAll((Collection<? extends String>) jsonObject);
for(int i = 0 ; i < 3 ; i++) {
try {
//Log.i("URL", "https://hacker-news.firebaseio.com/v0/item/" + jsonObject.get(i) + ".json?print=pretty");
String site = "";
site = "https://hacker-news.firebaseio.com/v0/item/" + jsonObject.get(i) + ".json?print=pretty";
URL Second = new URL(site);
URLConnection newURlCon = (HttpURLConnection) Second.openConnection();
InputStream input = newURlCon.getInputStream();
InputStreamReader secondreader = new InputStreamReader(input);
int pos = secondreader.read();
String all = "";
while (pos != -1) {
all += (char) pos;
pos = secondreader.read();
}
//Log.i("JSON",all);
JSONObject second = new JSONObject(all);
all = "";
articles.add(second.getString("title").toString());
Log.i("JSONSTR",articles.get(i));
//arrayAdapter.notifyDataSetChanged();
}
catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
Log.i("Exp",sw.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Dwnl dwnl = new Dwnl();
try {
dwnl.execute("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty").get();
ListView listView = (ListView) findViewById(R.id.listView1);
arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,articles);
listView.setAdapter(arrayAdapter);
}
catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
Log.i("Exp",sw.toString());
}
}
}
但始终显示此错误
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.widget.ListView.setAdapter(android.widget.ListAdapter)'
我不知道什么是null ther arraylist的大小为3并且根本没有空的
提前致谢
答案 0 :(得分:0)
ListView
抛出NullPointerException,而不是数组抛出
在onCreate
方法中,您应该致电:
setContentView(R.layout.your_layout);
将your_layout
替换为MainActivity
xml。
答案 1 :(得分:0)
Null是因为你从.doInBackground()返回null。您无法从后台线程将数据设置为适配器,它将引发另一个异常。您必须从.doInBackground返回结果,然后在.onPostExecute()
中处理它