Android 带有两个ListFragment的ViewPagerIndicator在加载数据时速度较慢
我有一个带有ViewPager和ViewPagerIndicator的应用程序。我做了两个标签使用TabPageIndicator。每个选项卡加载一个包含Internet数据的列表。当我运行应用程序从选项卡1和2加载数据时,这会导致显示视图的速度非常慢。 我希望当我启动我的应用程序时只加载数据选项卡1,当我移动或单击选项卡2时加载该选项卡的数据 你能帮我吗 多谢各位 我的代码: 主要活动Android 带有两个ListFragment的ViewPagerIndicator在加载数据时速度较慢,android,android-fragments,android-viewpager,viewpagerindicator,Android,Android Fragments,Android Viewpager,Viewpagerindicator,我有一个带有ViewPager和ViewPagerIndicator的应用程序。我做了两个标签使用TabPageIndicator。每个选项卡加载一个包含Internet数据的列表。当我运行应用程序从选项卡1和2加载数据时,这会导致显示视图的速度非常慢。 我希望当我启动我的应用程序时只加载数据选项卡1,当我移动或单击选项卡2时加载该选项卡的数据 你能帮我吗 多谢各位 我的代码: 主要活动 public class MainActivity extends FragmentActivity {
public class MainActivity extends FragmentActivity {
private static final String[] CONTENT = new String[] { "Releases", "Artists" };
private ListView listRls;
private List<Fragment> listaFragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
listaFragments = new ArrayList<Fragment>();
listaFragments.add(new FragmRls());
listaFragments.add(new FragmArt());
MyFragmentAdapter adapter = new MyFragmentAdapter(getSupportFragmentManager(),
listaFragments);
ViewPager pager = (ViewPager)findViewById(R.id.pager);
pager.setAdapter(adapter);
TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(pager);
}
class MyFragmentAdapter extends FragmentStatePagerAdapter {
//Implementacion del fragmentStateADapter
private List<Fragment> fragments;
public MyFragmentAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
// TODO Auto-generated constructor stub
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
return fragments.get(position);
}
@Override
public CharSequence getPageTitle(int position) {
return CONTENT[position % CONTENT.length].toUpperCase();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fragments.size();
}
}//fin adapter
}//fin class
public类MainActivity扩展了FragmentActivity{
私有静态最终字符串[]内容=新字符串[]{“发布”、“艺术家”};
私有列表视图列表;
私有列表列表片段;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE\u NO\u TITLE);
setContentView(R.layout.main);
listaFragments=newArrayList();
添加(新FragmRls());
添加(新FragmArt());
MyFragmentAdapter=新建MyFragmentAdapter(getSupportFragmentManager(),
列表碎片);
ViewPager pager=(ViewPager)findViewById(R.id.pager);
寻呼机设置适配器(适配器);
TabPageIndicator=(TabPageIndicator)findviewbyd(R.id.indicator);
指示器。设置视图寻呼机(寻呼机);
}
类MyFragmentAdapter扩展了FragmentStatePagerAdapter{
//fragmentStateADapter的实现
私有列表片段;
公共MyFragmentAdapter(FragmentManager fm,列出片段){
超级(fm);
//TODO自动生成的构造函数存根
this.fragments=片段;
}
@凌驾
公共片段getItem(int位置){
//TODO自动生成的方法存根
返回碎片。获取(位置);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回内容[位置%CONTENT.length].toUpperCase();
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回fragments.size();
}
}//翅片适配器
}//鳍类
从ListFragement扩展的一个类中的代码,另一个是相同的
public class FragmRls extends ListFragment{
JSONParser jParser = new JSONParser();
private static String url_all_post = "http://adeptlabel.com/listReleaseforTab.php";
private static String url_all_art = "http://adeptlabel.com/listArtists.php";
private static final String TAG_SUCCESS = "success";
private static final String TAG_posts = "wp_posts";
private static final String TAG_TITULO = "titulo";
private static final String TAG_IMAGEN = "imagen";
JSONArray posts = null;
private ArrayList <ElementosList> elementos = new ArrayList <ElementosList>();
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.fragmrls, null);
}//Fin On CreateView
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
elementos.clear();
loadDataJsonRls();
for(int i=0;i<ListViewConfig.getResim_list_txt().size();i++)
{
elementos.add(new ElementosList(ListViewConfig.getResim_list_txt().get(i),
ListViewConfig.getResim_list_img().get(i)));
}
ArrayAdapter<ElementosList>adaptador = new AdaptadorList(getActivity(),elementos);
setListAdapter(adaptador);
}
public void loadDataJsonRls()
{
List<NameValuePair> params = new ArrayList<NameValuePair>();
// getting JSON string from URL
JSONObject json = jParser.makeHttpRequest(url_all_post, "GET", params);
// Check your log cat for JSON reponse
Log.d("All releases: ", json.toString());
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
posts = json.getJSONArray(TAG_posts);
//Borramos los arrayList
ListViewConfig.deleteResim_list_img();
ListViewConfig.deleteResim_list_txt();
// looping through All post
for (int i = 0; i < posts.length(); i++) {
boolean repite = false;
JSONObject c = posts.getJSONObject(i);
// Storing each json item in variable
String titulo = c.getString(TAG_TITULO);
String imagen = c.getString(TAG_IMAGEN);
for(int j=0;j<ListViewConfig.getResim_list_txt().size();j++)
{
if(titulo.equals(ListViewConfig.getResim_list_txt().get(j)))
{
repite = true;
}
}
if(repite==false)
{
ListViewConfig.addImageUrls(imagen);
ListViewConfig.addTextUrls(titulo);
}
}
} else {
//Log.d("MainActivity.class", "No success Json");
}
} catch (JSONException e) {
e.printStackTrace();
}
}//fin cargarDatosJsonRls()
}//fin class
公共类FragmRls扩展了ListFragment{
JSONParser jParser=新的JSONParser();
私有静态字符串url\u all\u post=”http://adeptlabel.com/listReleaseforTab.php";
私有静态字符串url_all_art=”http://adeptlabel.com/listArtists.php";
私有静态最终字符串标记_SUCCESS=“SUCCESS”;
私有静态最终字符串TAG_posts=“wp_posts”;
私有静态最终字符串标记_TITULO=“TITULO”;
私有静态最终字符串标记_IMAGEN=“IMAGEN”;
JSONArray posts=null;
private ArrayList elementos=new ArrayList();
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(R.layout.fragmrls,空);
}//CreateView上的Fin
@凌驾
创建时的公共void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
elementos.clear();
loadDataJsonRls();
对于(int i=0;i如果要在用户切换到第二个选项卡时加载与该选项卡关联的数据,请尝试将加载数据的代码从onCreate移动到公共方法。然后设置OnPageChangeListener,并在调用onPageSelected时加载数据
此外,请确保异步加载数据,例如使用AsyncTask。如果在UI线程上进行网络调用,这就是UI速度慢的原因。您可能希望使用AsyncTask,从而有效地将网络活动移动到另一个线程。其doInBackground方法将处理网络事务,onPostExecute方法允许您在任务执行完成时更新UI。更多详细信息,请参阅官方文档
此外,根据您的需要和时间,您可以预加载数据,以缩短用户在屏幕上显示的加载时间,或者在加载数据时显示进度条,然后在加载完成后更新UI。我在此处找到的问题解决方案:
(
不过,感谢您的关注,Nartus和2Dee。我将尝试此方法。实现onPageChangeListener很简单,但我必须考虑调用数据加载。我将告诉您结果。谢谢。当我尝试实现OnPageSelected if setListAdapter调用时,我得到错误:方法setListAdapter(ArrayAdapter)对于类型new ViewPager.OnPageChangeListener(){}未定义事实上,我必须这么做,但首先我不想同时从两个选项卡加载数据。谢谢。我不确定你为什么要这样做,但每个选项卡片段都应该启动一个单独的异步任务,这样你就可以等待第一个任务启动第二个任务,尽管我建议不要这样做,因为用户仍然可以直接切换到选项卡2当他/她进入屏幕时。