0

У меня есть приложение с ViewPager и ViewPagerIndicator. У меня есть две вкладки с вкладкой TabPageIndicator. Каждая вкладка загружает список с данными Интернета. Когда я запускаю приложение, загружает данные с вкладки 1 и 2, это очень медленно отображает представление. Я хочу, чтобы при запуске приложения только загружать вкладку данных 1 и когда я перехожу или нажимаю на вкладку 2, загружайте данные для этой вкладки.ViewPagerIndicator с двумя ListFragment медленно при загрузке данных

Вы можете мне помочь?

спасибо.

Мой код:

MainActivity

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 

код в одном из классов, которые простираются от 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 

ответ

0

Если вы хотите загрузить данные, связанные со второй вкладкой, когда переключатель пользователя на эту вкладку, попробуйте переместить код, который загружает данные из OnCreate общедоступного метода. Затем установите OnPageChangeListener и загрузите данные, когда вызывается onPageSelected.

Кроме того, убедитесь, что вы загружаете данные асинхронно, например, используя AsyncTask.

+0

Постараюсь это Реализовать onPageChangeListener легко, но я должен.. подумайте, как вызвать загрузку данных.Я скажу вам результат.Спасибо. – Garmael

+0

Когда я пытаюсь реализовать OnPageSelected, если вызов setListAdapter вызывает ошибку: метод setListAdapter ( ArrayAdapter) не определен для типа нового ViewPager. OnPageChangeListener() {} – Garmael

+0

Что я могу сделать? – Garmael

0

Вы делаете свои сетевые вызовы в потоке пользовательского интерфейса, поэтому ваш интерфейс медленный. Вы можете использовать AsyncTask, эффективно перемещая свою сетевую активность в другой поток. Его метод doInBackground будет обрабатывать сетевые вещи, а метод onPostExecute позволяет обновить свой пользовательский интерфейс после завершения выполнения задачи. Более подробная информация содержится в официальной документации here.

Кроме того, в зависимости от ваших потребностей и времени вы можете предварительно загрузить данные, чтобы время загрузки, когда пользователь был представлен экраном, уменьшен или показывается ProgressBar во время загрузки данных, а затем обновите Пользовательский интерфейс при загрузке выполняется.

+0

На самом деле, я должен сделать все это, но сначала хотел не загружать данные с двух вкладок сразу. Спасибо. – Garmael

+0

Не знаете, зачем вам это нужно, но каждая вкладка Fragment должна запускать отдельную AsyncTask, чтобы вы могли дождаться, когда первая задача запустит вторую, хотя я бы посоветовал это сделать, поскольку пользователь все равно мог переключиться непосредственно на вкладку 2 как только он/она войдет в экран. – 2Dee