Android 在片段中加载JSON内容
我对Android环境非常陌生。我一直想从网页中检索JSON内容,所以我发现本教程可以从url()中获取JSON内容,并且它也可以正确地处理我的数据 现在,我想做的是:一个选项卡应用程序,其中一个选项卡使用该代码检索JSON数据。我使用了fragment,并试图修改代码以与fragment兼容,无论如何,当我启动相关选项卡时,应用程序崩溃 由于前面的教程工作正常,我很确定问题出在我的新手代码上 FragmentTab1.JavaAndroid 在片段中加载JSON内容,android,android-fragments,Android,Android Fragments,我对Android环境非常陌生。我一直想从网页中检索JSON内容,所以我发现本教程可以从url()中获取JSON内容,并且它也可以正确地处理我的数据 现在,我想做的是:一个选项卡应用程序,其中一个选项卡使用该代码检索JSON数据。我使用了fragment,并试图修改代码以与fragment兼容,无论如何,当我启动相关选项卡时,应用程序崩溃 由于前面的教程工作正常,我很确定问题出在我的新手代码上 FragmentTab1.Java package com.alessandrobocci.fenic
package com.alessandrobocci.fenice;
import java.util.ArrayList;
import java.util.HashMap;
import com.alessandrobocci.fenice.library.JSONParser;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class FragmentTab1 extends Fragment {
ListView list;
TextView title;
TextView name;
TextView api;
Button Btngetdata;
ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
//URL to get JSON Array
private static String url = "http://10.0.2.2/test/read.php";
//JSON Node Names
private static final String TAG_OS = "todo";
private static final String TAG_VER = "title";
JSONArray arr = null;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//Inflate the layout for this fragment
//This layout contains your list view
View view = inflater.inflate(R.layout.fragmenttab1, container, false);
title = (TextView)getView().findViewById(R.id.vers);
//now you must initialize your list view
list =(ListView)view.findViewById(R.id.listnews);
new JSONParse().execute();
return view;
}
private class JSONParse 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();
// Getting JSON from URL
JSONObject json = jParser.getJSONFromUrl(url);
return json;
}
@Override
protected void onPostExecute(JSONObject json) {
pDialog.dismiss();
try {
// Getting JSON Array from URL
arr = json.getJSONArray(TAG_OS);
for(int i = 0; i < arr.length(); i++){
JSONObject c = arr.getJSONObject(i);
// Storing JSON item in a Variable
String ver = c.getString(TAG_VER);
// Adding value HashMap key => value
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_VER, ver);
oslist.add(map);
//list=(ListView) getView().findViewById(R.id.list);
ListAdapter adapter = new SimpleAdapter(getActivity(), oslist,
R.layout.list_v,
new String[] { TAG_VER }, new int[] {
R.id.vers});
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getActivity(), "You Clicked at "+oslist.get(+position).get("title"), Toast.LENGTH_SHORT).show();
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
如果有必要,我还将发布其他代码,我不认为它有用,例如MainActivity.Java(包含选项卡)使用简单的FragmenTab代码检索一些文本。
希望我说的很清楚,谢谢。改变这个
title = (TextView)getView().findViewById(R.id.vers);
到
title
可能为空,导致NullPointerException
,如果您发布stacktrace,则可以确认该异常
还有一个提示,在for循环中设置了适配器。没必要那样做。将项目添加到列表并将适配器设置为listview一次如果您发布logcat输出,我们将能够更好地帮助您。好的,我将发布,谢谢:)@Markviduka发布完整的stacktrace。你的更新没有帮助我不理解连接被拒绝的错误,而在另一个项目中它工作了。在我的问题上添加了logcat的第一行错误,现在我将尝试你的更新tip@Markviduka更新没有帮助。张贴完整的堆栈trace@Markviduka什么是
FragmentTab1.java
80行方法onPostExecute()
从第77行开始,第80行是try&catch@Markviduka那么你的stacktrace没有指出NPE在正确的位置。进一步阅读
title = (TextView)getView().findViewById(R.id.vers);
title = (TextView)view.findViewById(R.id.vers);