0

Androidで更新されたlistViewを取得できません。私はlistViewを持つフラグメントを持っていて、そのアイテムはREST呼び出しによって返されます。ここで更新リスト内のフラグメントの表示

がAsyncTaskです:

private class GetMenuPizzeria extends AsyncTask<String, Void, Object[]> { 
    private final SelectPizzaFragment.ContentAdapter mListAdapter; 
    private final Context appContext; 
    private final String pizzeriaId; 

    private GetMenuPizzeria(ContentAdapter mListAdapter, Context appContext, String id) { 
     this.mListAdapter = mListAdapter; 
     this.appContext = appContext; 
     this.pizzeriaId = id; 
    } 

    @Override 
    protected Object[] doInBackground(String... params) { 
      return pizzeriaManager.getMenuPizzeria(pizzeriaId).toArray(); 
    } 

    @Override 
    protected void onPostExecute(Object[] result) { 
     mListAdapter.updateItems(result, appContext); 
    } 
} 

、ここではonPostExecute(updateItems)と呼ばれる関数である:

public void updateItems(Object[] newItems, Context appContext) { 

      PizzaMenu pm; 

      lPizzaNames.clear(); 
      lPizzaDesc.clear(); 
      lPizzaPrices.clear(); 

      Resources resources = appContext.getResources(); 
      TypedArray a = resources.obtainTypedArray(R.array.place_avator); 

      for (int i = 0; i < newItems.length; i++) { 
       pm = (PizzaMenu) newItems[i]; 
       lPizzaNames.add(pm.getName()); 
       lPizzaDesc.add(pm.getIngredients()); 
       lPizzaPrices.add(pm.getPrice()); 
       lPlaceAvators.add(a.getDrawable(0)); 
      } 
      this.notifyDataSetChanged(); 
    } 

その後、私はそのようAsyncTaskを呼び出します。

GetMenuPizzeria getMenuPizzeria = new GetMenuPizzeria(adapter, this.getContext(), id); 
getMenuPizzeria.execute(); 

それは私のフラグメントのonCreateViewの中で初めて呼び出すときに機能します。 問題は、私はリストを毎回選択ピザ屋の変更を更新する必要が、あるので、私はこの方法を書いた:リストである以外、方法が正しくAsyncTaskを呼び出し、私はすべてのエラーを取得していないことを

public void updatePizzeriaMenu(String idPizzeria) { 
    GetMenuPizzeria getMenuPizzeria = new GetMenuPizzeria(new ContentAdapter(recyclerView.getContext()), this.getContext(), idPizzeria); 
    getMenuPizzeria.execute(); 
} 

を(notifyDataSetChanged()が呼び出され、onBindViewHolderも呼び出されます)。私は、私がupdatePizzeriaMenuを呼び出すたびに設定されているリストのように思えるので、私がアダプタを取得する方法が間違っているとか、そういうものがあると思います。誰かが私を助けて、私が逃していることを教えてくれますか?事前のおかげで

編集:ここに私のアダプタクラスです:

public static class ContentAdapter extends RecyclerView.Adapter<ViewHolder> { 


    private final List<String> lPizzaNames = new ArrayList<String>(); 
    private final List<String> lPizzaDesc = new ArrayList<String>(); 
    private final List<String> lPizzaPrices = new ArrayList<String>(); 

    private final List<Drawable> lPlaceAvators = new ArrayList<Drawable>(); 

    public ContentAdapter(Context context) { 
     Resources resources = context.getResources(); 
     TypedArray a = resources.obtainTypedArray(R.array.place_avator); 
     a.recycle(); 
    } 


    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ViewHolder(LayoutInflater.from(parent.getContext()), parent); 
    } 

    public void updateItems(Object[] newItems, Context appContext) { 
     //see above.... 
    } 


    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.avator.setImageDrawable(lPizzaAvators.get(position % lPizzaAvators.size())); 
     holder.name.setText(lPizzaNames.get(position % lPizzaNames.size())); 
     holder.description.setText(lPizzaDesc.get(position % lPizzaDesc.size())); 
     holder.price.setText(lPizzaPrices.get(position % lPizzaPrices.size())); 
    } 



    @Override 
    public int getItemCount() { 
     return lPizzaPrices.size(); 
    } 



} 
+0

アダプタークラスを投稿することができます –

答えて

1

あなたはupdatePizzeriaMenu(String idPizzeria)方法で新しいアダプタを毎回作成しています。しかし、私はそれらのアダプターはrecyclerView.setAdapter()メソッドを介してリサイクラービューに関連していないと思う。新しいContentAdapterを作成せず、その代わりに前のアダプタオブジェクトを渡してください。

public void updatePizzeriaMenu(String idPizzeria) { 
    GetMenuPizzeria getMenuPizzeria = new GetMenuPizzeria(adapter, this.getContext(), idPizzeria); 
    getMenuPizzeria.execute(); 
} 

以前のデータに

lPizzaNames.clear(); 
lPizzaDesc.clear(); 
lPizzaPrices.clear(); 

をクリアして、新しいデータを更新していると、それが正常に動作する必要があります。

+0

回答ありがとうございましたが、ビュー用に使用しているアダプターがパブリックメソッド内で使用できないため、新しいアダプターを作成していました。 新しいContentAdapter(recyclerView.getContext()) – user1840039

+0

しかし、新しいContentAdapter(recyclerView.getContext())は、オブジェクトの新しいインスタンスを提供します。それはあなたに前のオブジェクトを与えませんよね? – CodeCameo

+0

これは正しいことですが、問題は、断片内のパブリックメソッドから現在使用されているアダプタにどのようにアクセスできますか?アダプタの現在のインスタンスを取得するにはどうすればいいですか? – user1840039

0

この方法でアダプタを更新しておらず、いくつかの変数にいくつかの値を割り当てていて、それらの変数がアダプタと関係がないようであれば、アダプタにObjectを設定する必要があります。例えば、

this.setPizzaMenuList(pizzaMenuList); 
this.notifyDataSetChanged)(); 

はListView.and

lpizzaMenuList= pizzaMenuList; 
this.notifyDataSetChanged)(); 

は、リストビューは更新されません

を更新します!

関連する問題