0

我無法獲取Android上更新的listView。我有一個listView的片段,其項目由REST調用返回。Android中的片段更新列表視圖

這裏是的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中調用它時,它就起作用了。 問題是,我每次都選擇比薩店變化更新列表,所以我寫了一個方法:

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

該方法正確調用的AsyncTask,我沒有得到任何錯誤,除了名單未更新(​​但調用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()方法與任何recyclerView無關。因此,不要每次都創建新的ContentAdapter而是傳遞前一個適配器對象。

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

當你正在清除以前的數據

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

和更新新的數據,它應該工作的罰款。

+0

謝謝您的回答Sifat,但我創建一個新的適配器,因爲我使用的視圖的適配器不能用於公共方法裏面,所以我試圖用檢索: 新的ContentAdapter(recyclerView.getContext()) – user1840039

+0

但新的ContentAdapter(recyclerView.getContext())將給出該對象的新實例。它不會給你以前的對象,對吧? – CodeCameo

+0

這是對的,所以問題是,我如何從片段內的公共方法訪問當前使用的適配器?我的意思是我如何獲得適配器的當前實例? – user1840039

0

你沒有更新這個方法中的適配器,你正在給某些變量賦值,而且它看起來不是那些與適配器有任何關係的變量,你必須在適配器中設置Object!

例如,

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

將更新ListView.and

lpizzaMenuList= pizzaMenuList; 
this.notifyDataSetChanged)(); 

將不會更新的ListView!