Android 尝试使用片段获取三个json提要
我正在创建一个应用程序,其中一个活动将使用片段。在每个片段视图中,我将使用三个文件和每个视图中的三个适配器从数据库中提取。第一个片段按预期工作。但是,当我将json解析器代码添加到第二个滑动视图时,我看到它会在加载活动后立即尝试触发(我将第二个滑动视图设置为toast),json解析器不会将任何数据加载到第二个视图中。我应该在切换视图时将JSON附加到主活动并切换适配器和URL,还是应该尝试从每个片段加载JSON(这就是我现在正在做的)。如有任何见解,将不胜感激。谢谢Android 尝试使用片段获取三个json提要,android,json,android-fragments,fragment,Android,Json,Android Fragments,Fragment,我正在创建一个应用程序,其中一个活动将使用片段。在每个片段视图中,我将使用三个文件和每个视图中的三个适配器从数据库中提取。第一个片段按预期工作。但是,当我将json解析器代码添加到第二个滑动视图时,我看到它会在加载活动后立即尝试触发(我将第二个滑动视图设置为toast),json解析器不会将任何数据加载到第二个视图中。我应该在切换视图时将JSON附加到主活动并切换适配器和URL,还是应该尝试从每个片段加载JSON(这就是我现在正在做的)。如有任何见解,将不胜感激。谢谢 public class
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)。很有趣。。我会试试看。如果它有效,我会让你知道,这样你就可以把它作为一个答案,这样其他人也可以从中受益,因为刷卡适配器或多或少是一个高级主题,你也会得到分数。