2016-08-14 8 views
0

私はかなり見渡してきましたが、私は運がなかったので、特に私が間違った方向に行くかどうかを知りたいと思っています。完了時にアダプター項目に値を設定する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

項目ごとに3つのAsyncTasks?あなたのバッテリーの使用量はあまりにも幸せであってはなりません... APIを再構成できませんか? –

+1

'私はasynctaskを呼び出してこれらの情報を取得し、アダプタ項目に値を設定します。アダプターアイテムはどういう意味ですか?あなたが言う前に、あなたはオブジェクトを持つ配列リストを持っていました。あなたは同じサイズの別のarraylistを配置し、そこに結果を入れなければなりません。次に、afapter notifyDatasetChangedを呼び出します。あなたはスクロール中にそれらを失うkotherwiseとしてあなたはアーレイに結果を保存します。 – greenapps

+1

非同期タスクには、開始されたアイテムと終了時に結果を置く場所を知らないので、追加パラメータ 'i'を与える必要があります。 – greenapps

答えて

0

私はアダプタを正しく使用していませんでしたが、@ greenapps入力のおかげで問題を解決できました。

基本的に、変数viewHolderItemをgetView関数に移動しました。これをコンストラクタを介してすべてのAsyncTasksに渡します。その結果、サーバーから結果を取得するとアダプタ項目に値を設定できます。修正は、上記の後の例として

が、これは私のAsyncTaskクラスの1つです:あなたがコードで見ることができるように

/** 
* Download the JSON of the demand 
*/ 
private class GetDemand extends GetRequest { 

    private int passengershipID; 
    private ViewHolderItem viewHolderItem; 

    public GetDemand(int passengershipID, ViewHolderItem viewHolderItem){ 
     this.passengershipID = passengershipID; 
     this.viewHolderItem = viewHolderItem; 
    } 

    @Override 
    protected void onPostExecute(ServerResponseObject serverResponseObject){ 
     Demand demand = GsonCustomBuilder.getGson().fromJson(
       serverResponseObject.getJSONObject().toString(), Demand.class); 
     Passengership passengership = passengershipsHashMap.get(passengershipID); 
     passengership.setDemand(demand); 
     demand.populateView(viewHolderItem.rideInfo); 
    } 
} 

、私はAsyncTask viewHolderItemに渡すために使用するconstuctorを持っています。最後に、onPostExecuteでは、viewHolderItemを使用して取得した情報を設定します。

+0

これ以上見ることができないアイテムがある場合、これは行いません。現時点ではあなたは2つのアイテムしか持っていないと言いました。しかし、テストのためには、ユーザーがスクロールしなければならないようにもっと多くの項目を追加してください。あなたのアプローチは間違っていることがわかります。代わりに何をすべきか私はすでに私の最初のコメントであなたに言った。 – greenapps

関連する問題