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!