2016-04-04 6 views
2

Ich habe ein Fragment erstellt und ich füllen eine Listenansicht in es mit Retrofit für Netzwerkverbindung und Anfrage erhalten und ich erstellte benutzerdefinierten Adapter, um Listenansicht zu füllen:Wie man eine Art faulen Laden in meinem listview android studio

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); 
    } 
} 
} 

Ich habe 2 Layouts für Artikel und für Listenansicht erstellt und es funktioniert alles wie es sollte. Jetzt muss ich eine Art von Lazy Load oder etwas einfacher hinzufügen, weil es eine Chance gibt, dass der Server eine Menge Daten zurückgibt und ich möchte sie 20 mal 20 zeigen, um das Netzwerk effizienter zu machen. Das ist mein Fragment Code:

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"); 

     } 
    }); 
} 
} 

Das ist mein Aufruf von Network SDK in Retrofit

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

Aus all dem ich ein Listview in meinem Fragment erhalten, die alle verfügbaren Transaktionen zeigen, dass ich möchte zeige, aber ich muss es auf etwa 20 begrenzen und wenn Benutzer Swipe unten muss es zeigen, 20 und so weiter. Ich habe eine Idee, eine Indexnummer zu senden, wenn der Benutzer wischt oder ähnliches, aber ich bin sicher, dass es einen einfacheren Weg gibt, weil ich nicht so gut mit Android bin.

Ich habe auch versucht, Dinge wie endlose Adapter, aber ich darf nicht Bibliotheken verwenden, wie Retrofit oder Volley nicht wirklich beliebt sind und diese: https://github.com/commonsguy/cwac-endless nicht suppor Bereitstellung von mehr und ich bin nicht einmal sicher ist es noch gültig

Antwort

0

Verwenden Sie OnScrollListener, um zu erkennen, ob die Liste nach unten gescrollt wurde oder nicht. und dann Daten laden.

nach dem Laden von Daten vergessen Sie nicht, Ihre Liste in Adapter zu aktualisieren.

public void updateInUi() { 

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

Eine andere Methode, wenn das Ende des Liste zu erkennen ist, ist innerhalb getView Methode Ihrer Adapter als solche erreicht:

@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; 
}