Android 尝试使用片段获取三个json提要

Android 尝试使用片段获取三个json提要,android,json,android-fragments,fragment,Android,Json,Android Fragments,Fragment,我正在创建一个应用程序,其中一个活动将使用片段。在每个片段视图中,我将使用三个文件和每个视图中的三个适配器从数据库中提取。第一个片段按预期工作。但是,当我将json解析器代码添加到第二个滑动视图时,我看到它会在加载活动后立即尝试触发(我将第二个滑动视图设置为toast),json解析器不会将任何数据加载到第二个视图中。我应该在切换视图时将JSON附加到主活动并切换适配器和URL,还是应该尝试从每个片段加载JSON(这就是我现在正在做的)。如有任何见解,将不胜感激。谢谢 public class

我正在创建一个应用程序,其中一个活动将使用片段。在每个片段视图中,我将使用三个文件和每个视图中的三个适配器从数据库中提取。第一个片段按预期工作。但是,当我将json解析器代码添加到第二个滑动视图时,我看到它会在加载活动后立即尝试触发(我将第二个滑动视图设置为toast),json解析器不会将任何数据加载到第二个视图中。我应该在切换视图时将JSON附加到主活动并切换适配器和URL,还是应该尝试从每个片段加载JSON(这就是我现在正在做的)。如有任何见解,将不胜感激。谢谢

public class chatfragment extends Fragment {

    ListView l;
    List<chatitem> listItem;
    ChatListAdapter adapter;
    String category = "430";
    chatitem item;

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

        View rootView = inflater.inflate(R.layout.chatfragment, container, false);

        l = (ListView) rootView.findViewById(R.id.chatlist);
        listItem = new ArrayList<chatitem>();
        adapter = new ChatListAdapter(getActivity(),R.layout.chatfragment, listItem);
        l.setAdapter(adapter);

        new ReadWeatherJSONFeedTask().execute("myurl");

        return rootView;
    }

    public String readJSONFeed (String URL){
        StringBuilder stringBuilder = new StringBuilder();
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(URL);
        try{
            HttpResponse response = httpClient.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if(statusCode == 200){
                HttpEntity entity = response.getEntity();
                InputStream inputStream = entity.getContent();
                BufferedReader reader = new BufferedReader(
                new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) !=null){
                    stringBuilder.append(line);
                }
                inputStream.close();
            }else{
                Log.d("readJSONFeed", "Failed to download file");
            }
        }catch (Exception e){
            Log.d("readJSONFeed", e.getLocalizedMessage());
        }
        return stringBuilder.toString();
    }

    private class ReadWeatherJSONFeedTask extends AsyncTask<String, Void, String>{
        protected String doInBackground(String...urls){
            return readJSONFeed(urls[0]);
        }
        protected void onPostExecute(String result){
            try{
                JSONObject jsonObject = new JSONObject(result);
                JSONArray subcat  = new
                JSONArray(jsonObject.getString("results"));
                for(int i = 0; i < subcat.length(); i++){
                    JSONObject p = subcat.getJSONObject(i);

                    item = new chatitem(p.getString("hubusername"),p.getString("picture"),p.getString("timeadjust"),p.getString("comment"));

                    listItem.add(item);

                    // Toast.makeText(getApplicationContext(), p.getString("subcategory"), Toast.LENGTH_LONG).show();

                    adapter.notifyDataSetChanged();
                }
            }catch (Exception e){
                Log.d("ReadWeatherJSONFeedTask", e.getLocalizedMessage());
            }

            // Toast.makeText(getApplicationContext(), "done", Toast.LENGTH_LONG).show();
        };
    }
}
公共类chatfragment扩展了片段{
列表视图l;
清单项目;
适配器;
字符串category=“430”;
查特项目;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.chatfragment,container,false);
l=(ListView)rootView.findViewById(R.id.chatlist);
listItem=新的ArrayList();
adapter=新的ChatListAdapter(getActivity(),R.layout.chatfragment,listItem);
l、 设置适配器(适配器);
新建ReadWeatherJSONFeedTask()。执行(“myurl”);
返回rootView;
}
公共字符串readJSONFeed(字符串URL){
StringBuilder StringBuilder=新的StringBuilder();
HttpClient HttpClient=新的DefaultHttpClient();
HttpGet HttpGet=新的HttpGet(URL);
试一试{
HttpResponse response=httpClient.execute(httpGet);
StatusLine StatusLine=response.getStatusLine();
int statusCode=statusLine.getStatusCode();
如果(状态代码==200){
HttpEntity=response.getEntity();
InputStream InputStream=entity.getContent();
BufferedReader reader=新的BufferedReader(
新的InputStreamReader(inputStream));
弦线;
而((line=reader.readLine())!=null){
stringBuilder.append(行);
}
inputStream.close();
}否则{
Log.d(“readJSONFeed”,“未能下载文件”);
}
}捕获(例外e){
d(“readJSONFeed”,例如getLocalizedMessage());
}
返回stringBuilder.toString();
}
私有类ReadWeatherJSONFeedTask扩展了AsyncTask{
受保护的字符串doInBackground(字符串…URL){
返回readJSONFeed(URL[0]);
}
受保护的void onPostExecute(字符串结果){
试一试{
JSONObject JSONObject=新JSONObject(结果);
JSONArray subcat=new
JSONArray(jsonObject.getString(“结果”);
对于(int i=0;i
你可以做很多事情。我建议在活动中准备数据(从Web下载等),然后将其加载到片段中


ViewPager不仅准备当前片段,还准备列表中的下一个片段。如果您对此行为有问题,您必须使用pageChangeListener并在片段处于活动状态时更新它们。

您是说我应该在活动中下载三个JSON文件,将它们加载到相应的数组列表中,然后在切换到该视图时显示它们?出于某种原因,我可以看到一些瓶颈。。。特别是因为不是每个用户最终都会使用这三个片段,我只是在客户端和服务器上浪费系统资源。有没有一种方法可以让片段适配器不计算下一个片段?用户更喜欢速度以降低数据使用率。如果你想阻止数据使用,如果他们不在wifi上,你可以显示一个微调器,然后当他们在给定页面上时启动dl。。当我在片段中滑动时,android是否会自动清除用于保存内存的内容,或者在滑动视图中的所有内容都会保留在内存中,直到从内存中释放出来?如果在viewpager上使用fragmentstatepageradapter,则当你滑动得更远(超过1个视图)时,它们会被销毁。带有FragmentStatePagerAdapter的ViewPager可以记住每侧1个片段(初始位置仅为0+1)。很有趣。。我会试试看。如果它有效,我会让你知道,这样你就可以把它作为一个答案,这样其他人也可以从中受益,因为刷卡适配器或多或少是一个高级主题,你也会得到分数。