2016-04-04 3 views
2

J'ai créé un fragment et je remplis une vue de liste en utilisant Retrofit pour la connexion réseau et obtenir une requête et j'ai créé un adaptateur personnalisé pour remplir la liste:Comment faire une sorte de charge paresseuse dans mon studio android listview

public class TransactionsAdapter extends BaseAdapter { 
ArrayList<Transactions> transactions; 


public TransactionsAdapter(ArrayList<Transactions> transactions) { 
    this.transactions=transactions; 
} 

@Override 
public int getCount() { 
    if (transactions.size()<20) { 
     return transactions.size(); 
    }else return 20; 

} 

@Override 
public Object getItem(int position) { 
    return transactions.get(position); 
} 
@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view=null; 
    ViewHolder viewHolder = null; 

    if(convertView == null) 
    { 
     view = LayoutInflater.from(parent.getContext()).inflate(R.layout.izvjestaji_item,parent,false); 
     viewHolder = new ViewHolder(view); 
     view.setTag(viewHolder); 

    } 
    else{ 
     view = convertView; 
     viewHolder= (ViewHolder) view.getTag(); 

    } 

    Transactions transactions = (Transactions) getItem(position); 

    if(transactions != null) { 

     viewHolder.datum.setText(transactions.getShortDate()); 
     viewHolder.partner.setText(transactions.getMerchantName()); 
     String doublestring=Double.toString(transactions.getTransactionPointsAmount()); 
     String doublestring1=Double.toString(transactions.getSalesAmount()); 
     viewHolder.iznos.setText(doublestring1); 
     viewHolder.brojbodova.setText(doublestring); 
    } 

    return view; 
} 


private class ViewHolder{ 
    TextView datum; 
    TextView partner; 
    TextView iznos; 
    TextView brojbodova; 

    public ViewHolder(View view) { 
     this.datum = (TextView) view.findViewById(R.id.izvjestaji_datum); 
     this.partner = (TextView) view.findViewById(R.id.izvjestaji_partner); 
     this.iznos = (TextView) view.findViewById(R.id.izvjestaji_iznos); 
     this.brojbodova=(TextView)view.findViewById(R.id.izvjestaji_brojbodova); 
    } 
} 
} 

J'ai créé 2 mises en page pour item et pour la vue liste et tout fonctionne comme il se doit. Maintenant, j'ai besoin d'ajouter une sorte de chargement paresseux ou quelque chose de plus simple car il y a une chance que le serveur renverra beaucoup de données et je veux les montrer comme 20 par 20 pour augmenter l'efficacité du réseau. Ceci est mon code fragment:

public class Izvjestaji extends Fragment { 
    // The onCreateView method is called when Fragment should create its View 
    object hierarchy, 
// either dynamically or via XML layout inflation. 
ListView list; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle 
savedInstanceState) { 
    // Defines the xml file for the fragment 


    return inflater.inflate(R.layout.izvjestaji, parent, false); 

} 

// This event is triggered soon after onCreateView(). 
// Any view setup should occur here. E.g., view lookups and attaching view   
listeners. 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    list=(ListView)view.findViewById(R.id.izvjestaji_list); 
    showList(); 
    // Setup any handles to view objects here 
    // EditText etFoo = (EditText) view.findViewById(R.id.etFoo); 

} 
public void showList(){ 

    NetworkSDK.getInstance().getTransactions(new  
    Callback<List<Transactions>>() { 
     @Override 
     public void onResponse(Call<List<Transactions>> call,   
     Response<List<Transactions>> response) { 
      if(response.isSuccess()){ 
       Log.d("Data", String.valueOf(response.isSuccess())); 
       TransactionsAdapter transactionsAdapter=new 
     TransactionsAdapter((ArrayList<Transactions>)response.body()); 
       list.setAdapter(transactionsAdapter); 


      } 
     } 

     @Override 
     public void onFailure(Call<List<Transactions>> call, Throwable t) { 
      Log.d("Error","Def error"); 

     } 
    }); 
} 
} 

Ceci est mon appel du SDK réseau dans la modernisation

public void getTransactions(Callback<List<Transactions>>callback){ 
    Call<List<Transactions>>call =                           
    BaseClient.getService().getTransactions(4,2016); 
      call.enqueue(callback); 
} 

De tout cela je reçois un listview dans mon fragment qui montrent toutes les transactions disponibles que je veux montrer mais j'ai besoin de le limiter à environ 20 et lorsque l'utilisateur glisser en bas, il faut montrer un autre 20 et ainsi de suite. J'ai eu une idée comme envoyer un certain numéro d'index lorsque l'utilisateur balaye ou similaire, mais je suis sûr qu'il y a un moyen plus facile, car je ne suis pas très bon avec Android.

J'ai aussi essayé des choses comme adaptateur sans fin mais je ne suis pas autorisé à utiliser les bibliothèques qui ne sont pas vraiment populaires comme rétrofit ou volée et celui-ci: https://github.com/commonsguy/cwac-endless ne fournit pas suppor plus et je ne suis même pas sûr est-il encore valide

Répondre

0

utilisez OnScrollListener pour détecter si la liste a été déplacée vers le bas ou non. puis charger les données.

mListView.setOnScrollListener(new OnScrollListener() { 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 

    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     if (mListView.getAdapter() == null) 
      return ; 

     if (mListView.getAdapter().getCount() == 0) 
      return ; 

     int l = visibleItemCount + firstVisibleItem; 
     if (l >= totalItemCount && !isLoading) { 
      // It is time to add new data. We call the listener 
      isLoading = true; 
      loadYourData(); 
     } 
    } 
}); 

après le chargement des données ne pas oublié d'actualiser votre liste dans l'adaptateur.

public void updateInUi() { 

    // send your request and get list of updated items 
    List<> newItems = getYourUpdatedListHere() 
    yourDataList.addAll(newItems); 
    adapter.notifyDataSetChanged(); 
} 
0

Une autre méthode pour détecter si la fin de la liste a été atteinte est à l'intérieur de votre méthode getViewAdapter en tant que tel:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (position == getCount() - 1) { // scrolled to last item 
     if (mRepo.hasMore()) { // if there are more items than we are displaying 
      new MyAsyncLoaderTask().execute(); 
     } 
    } 
    // usual getView implementation follows... 
    return view; 
}