【发布时间】:2017-09-12 04:45:12
【问题描述】:
我无法在 Android 上更新 listView。我有一个带有 listView 的片段,它的项目由 REST 调用返回。
这里是异步任务:
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();
}
}
【问题讨论】:
-
你能发布你的适配器类吗
标签: android listview android-fragments android-asynctask android-recyclerview