私はかなり見渡してきましたが、私は運がなかったので、特に私が間違った方向に行くかどうかを知りたいと思っています。完了時にアダプター項目に値を設定するasynctask
私はアダプタをインスタンス化して、オブジェクトのarraylistを渡すフラグメントを持っています。オブジェクトのリストは、表示されるためにサーバから検索されなければならない他のリソースを参照する。したがって、arraylistのすべてのオブジェクトに対して、アダプタの中にがある場合は、これらの情報を取得してアダプタ項目を設定するasynctaskを呼び出します。
残念ながら、この結果、すべての情報を含むarraylsitの最後の要素だけが返されますが、他の部分(私の例ではリストに2つの要素しかありません)は空です。私は同じアダプター項目を2回オーバーライドしているので、最後に取得したオブジェクトしか表示されません。
私のアダプタはViewHolderデザインパターンを使用しているので、getView関数ではすべてのレイアウト要素への参照を含むViewHolderItemプライベートクラスのオブジェクトをインスタンス化します。私はすべての私のonPostExecuteでこのviewHolderItemを使用してアダプター項目を設定します。
これは私のViewHolderアイテムのコードです:
private static class ViewHolderItem{
protected Button leaveFeedback, accept, reject;
protected LinearLayout userInfo, rideInfo, pickupLayout, buttons;
protected TextView pickupTimeText;
protected PickupTime pickupTime;
}
これは(コメントの後の行は、乗客の情報を取得する)viewholderitemを設定し、ビューの参照を収集し、私のgetViewメソッドであるとasynctasksを起動します:
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
// First let's verify the view is not null
if (view == null) {
// This a new view we inflate the new layout
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.ride_passenger_item, viewGroup, false);
viewHolderItem = new ViewHolderItem();
viewHolderItem.userInfo = (LinearLayout) view.findViewById(R.id.user_info);
viewHolderItem.rideInfo = (LinearLayout) view.findViewById(R.id.ride_info);
viewHolderItem.buttons = (LinearLayout) view.findViewById(R.id.btns);
viewHolderItem.leaveFeedback = (Button) view.findViewById(R.id.leave_feedback);
viewHolderItem.pickupLayout = (LinearLayout) view.findViewById(R.id.pickup_layout);
viewHolderItem.pickupTimeText = (TextView) view.findViewById(R.id.pickup_time);
viewHolderItem.accept = (Button) view.findViewById(R.id.accept);
viewHolderItem.reject = (Button) view.findViewById(R.id.reject);
// store the holder with the view.
view.setTag(viewHolderItem);
}
else{
// we've just avoided calling findViewById() on resource everytime
// just use the viewHolder
viewHolderItem = (ViewHolderItem) view.getTag();
}
final Passengership passengership = passengerships.get(i);
/** retrieve passenger info **/
new GetDemand().execute(demandAPI.getDemand());
new GetPassenger().execute(userAPI.getUser(passengership.getPassenger()));
new GetRide().execute(rideAPI.getRide());
/**
* if we are displaying pending passenger request, proposed by the driver
* we need to enable the accept reject button
**/
if(type.equals(Status.PENDING) && !passengership.isProposedByDriver())
buildAcceptRejectButtons(passengership);
this.passengershipID = passengership.getId();
return view;
}
そして、これは私のAsyncTaskクラスの1つです:
/**
* Download the JSON of the demand
*/
private class GetDemand extends GetRequest {
@Override
protected void onPostExecute(ServerResponseObject serverResponseObject){
Demand demand = GsonCustomBuilder.getGson().fromJson(
serverResponseObject.getJSONObject().toString(), Demand.class);
demand.populateView(viewHolderItem.rideInfo);
}
}
demand.populateView()は、基本的にビュー参照を含むviewHolderItemを渡して、その中の情報を埋め込むことができる関数です。
項目ごとに3つのAsyncTasks?あなたのバッテリーの使用量はあまりにも幸せであってはなりません... APIを再構成できませんか? –
'私はasynctaskを呼び出してこれらの情報を取得し、アダプタ項目に値を設定します。アダプターアイテムはどういう意味ですか?あなたが言う前に、あなたはオブジェクトを持つ配列リストを持っていました。あなたは同じサイズの別のarraylistを配置し、そこに結果を入れなければなりません。次に、afapter notifyDatasetChangedを呼び出します。あなたはスクロール中にそれらを失うkotherwiseとしてあなたはアーレイに結果を保存します。 – greenapps
非同期タスクには、開始されたアイテムと終了時に結果を置く場所を知らないので、追加パラメータ 'i'を与える必要があります。 – greenapps