Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON下载到ListView_Java_Android_Json_Listview - Fatal编程技术网

Java JSON下载到ListView

Java JSON下载到ListView,java,android,json,listview,Java,Android,Json,Listview,我发现我已经适应了我的需要。然而,我面临着一个小问题。数据似乎是从远程主机获得的,但无法解析为适配器 我已经检查了我的整个代码结构,以确保一切就绪,但我似乎找不到问题。ListView位于作为TabbedActivity一部分的片段内部 这是我的代码: 选项卡式活动中的片段 public class shops extends Fragment { String url="http://link to remote webservice"; //FragmentManager fm; //n

我发现我已经适应了我的需要。然而,我面临着一个小问题。数据似乎是从远程主机获得的,但无法解析为适配器

我已经检查了我的整个代码结构,以确保一切就绪,但我似乎找不到问题。ListView位于作为TabbedActivity一部分的片段内部

这是我的代码:

选项卡式活动中的片段

public class shops extends Fragment {
String url="http://link to remote webservice";

//FragmentManager fm;

//newInstance() method return reference to fragment
public static shops newInstance(){
    shops fragment = new shops();
    return fragment;
}


public shops() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    //fm = getFragmentManager();

    View view = inflater.inflate(R.layout.fragment_shops, container, false);


    final ListView listView = (ListView)view.findViewById(R.id.shops_info);
    final Downloader d =new Downloader(getActivity(),url,listView);
    d.execute();


//calls DialoFragment
    FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab_edset);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            DialogFragment newEdQua = new createNewEdQua();
            newEdQua.show(getActivity().getFragmentManager(), "createNewEdQua");

        }
    });

    // Inflate the layout for this fragment
    return view;
}

}
Downloader(在同一类中接收数据并进行解析)

与ADM看到的略有不同(这里首先是成功信息)

我在php webservice中构造数组时定义了成功消息


我打算在几个选项卡中使用Downloader类来实现相同的目的(从url解析中检索数据并在ListView中显示)。URL和数据是相互独立的,所以我想它应该可以工作…

查看LogCat并查看从服务器获得的JSON数据,我能够解决问题。如果数据是一个包含对象的数组,我以前的代码就可以正常工作。但是我检查了一下,JSON的结构是一个包含数组的对象

我要做的是用JSONObject获取对象,然后该对象用JSONArray检索数组。。像这样:

            JSONObject jsonObject=new JSONObject(data);
            JSONArray jsonArray= jsonObject.getJSONArray("qualifications");

//now this Array has Objects needed

            for (int i=0;i<jsonArray.length();i++){

                String institution=jsonArray.getJSONObject(i).getString("Qualification");
                edqua.add(institution);
            }

            //provide the ArrayAdapter<> needed
            ArrayAdapter<String> adapter=new ArrayAdapter<String>(c,R.layout.list_item_edqua,edqua);
            listView.setAdapter(adapter);
JSONObject JSONObject=新的JSONObject(数据);
JSONArray JSONArray=jsonObject.getJSONArray(“资格”);
//现在这个数组有了所需的对象
对于(
ArrayList
显示的(int i=0;i),列表项类似于
Qualification eq\u end\u date eq\u loc\u shops
作为单个字符串,因此初始化
适配器

adapter=new ArrayAdapter(context,android.R.layout.simple_list_item_1,shopl);

您的大部分代码都可以重用,但从
downloadData()

因此,您可以将这些代码提取到接口(此处称为IPreParser)的方法(称为
JSONArrayObject arrayFromData(String)
)中,如下所示:

public interface IPreParser{
    JSONArrayObject arrayFromData(String data);
}
您的下载程序需要持有对
IPreParser
的引用,并在
onPostExecute()
中调用其方法。您可以通过声明
doInBackground(IPreParser)
来初始化此引用


在下载和解析数据的任何地方,只需实现
iprepasser
,然后使用
downloader.execute(您的实现者)执行您的下载程序

catch
块中使用
Log
检查
data
变量是否为有效的json数组,其内容是否为有效的json对象。此外,记录异常可能会有所帮助。好的,谢谢,我已经修改了我的代码,请查看显示您在执行服务时获得的数据…日志显示类型不匹配..from我能告诉你的是,我得到的是一个包含数组的对象,而不是一个包含对象的数组。这有意义吗?我看到了>,但我不知道如何将它应用到我的JSON结构中。为什么你要在循环中一次又一次地设置适配器?你不应该在回答中征求建议-你可以发表新文章或编辑原始问题点注..@cricket_007..第一个对象现在在其中获取数据,它是一个包含其他对象的数组。因此,让对象到达数组,然后通过循环检索其中的对象..查看JSON结构右侧,但您只需要一个适配器。您可以在循环之前或之后创建并设置它,只需一次。无需若要在循环中继续设置,请将在循环中调用
listView.setAdapater()
的旧代码替换为新代码,否则有人会感到困惑。
{"success":1,"qualifications":[{"eq_edu_Institution":"Oracle","eq_start_Date":"1998-06-14","eq_end_date":"2005-08-23","Qualification":"Software Engineer"},{"eq_edu_Institution":"Oracle","eq_start_Date":"1998-06-14","eq_end_date":"2005-08-23","Qualification":"Software Engineer"},{"eq_edu_Institution":"Oracle","eq_start_Date":"1998-06-14","eq_end_date":"2005-08-23","Qualification":"Software Engineer"},{"eq_edu_Institution":"Oracle","eq_start_Date":"1998-06-14","eq_end_date":"2005-08-23","Qualification":"Software Engineer"},{"eq_edu_Institution":"Oracle","eq_start_Date":"1998-06-14","eq_end_date":"2005-08-23","Qualification":"Software Engineer"},{"eq_edu_Institution":"Oracle","eq_start_Date":"1998-06-14","eq_end_date":"2005-08-23","Qualification":"Software Engineer"},{"eq_edu_Institution":"Oracle","eq_start_Date":"1998-06-14","eq_end_date":"2005-08-23","Qualification":"Software Engineer"}]}
            JSONObject jsonObject=new JSONObject(data);
            JSONArray jsonArray= jsonObject.getJSONArray("qualifications");

//now this Array has Objects needed

            for (int i=0;i<jsonArray.length();i++){

                String institution=jsonArray.getJSONObject(i).getString("Qualification");
                edqua.add(institution);
            }

            //provide the ArrayAdapter<> needed
            ArrayAdapter<String> adapter=new ArrayAdapter<String>(c,R.layout.list_item_edqua,edqua);
            listView.setAdapter(adapter);
public interface IPreParser{
    JSONArrayObject arrayFromData(String data);
}