2016-04-04 13 views
2

1つのフラグメントを作成しました。ネットワーク接続用にRetrofitを使用してリストビューを作成して、リクエストを取得してリストビューを作成するカスタムアダプタを作成しました:私のリストビューアンドロイドスタジオで何らかの遅延ロードを行う方法

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

私はアイテムとリストビューの2つのレイアウトを作成しました。サーバーが大量のデータを返す可能性があるため、ネットワークの効率を上げるために、20〜20のように表示したいので、何らかの遅延ロードなどを追加する必要があります。 これは私のフラグメントのコードです:

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

     } 
    }); 
} 
} 

これは改造のNetwork SDKからの私のコール、このすべてから

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

である私は私がしたいすべての利用可能なトランザクションを示して、私のフラグメントでリストビューを取得私はそれを約20に制限する必要があり、ユーザがスワイプボトムを表示すると、別の20などを表示する必要があります。私はユーザーがスワイプまたは同様のときにいくつかのインデックス番号を送信するようにいくつかのアイデアを持っていますが、私はアンドロイドで良いことではないので、いくつかの簡単な方法があると確信しています。

私はまた、無限のアダプタのようなものを試してみましたが、私は改造やボレーと、このような本当に人気でないライブラリを使用することは許されないのです。 https://github.com/commonsguy/cwac-endless もうsupporを提供していないと私はそれがまだあるにもわからないんだけど有効

答えて

0

OnScrollListenerを使用して、リストがスクロールダウンしたかどうかを検出します。データをロードします。

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

データをロードするには、アダプタであなたのリストを更新するのを忘れないでください後。

public void updateInUi() { 

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

リストの最後に到達したかどうかを検出するための別の方法は、次のようなあなたのAdaptergetViewメソッド内です:

@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; 
} 
関連する問題