没有 notifyDataSetChanged 的列表视图刷新
Listview refresh without notifyDataSetChange
notifyDataSetChanged 有问题。我有一个从 sqlite 数据库中检索数据的列表。问题是我知道每次使用列表 class 的添加方法时都必须调用 notifyDataSetChanged。我不明白为什么我的列表在没有 notifyDataSetChange() 的情况下调用 addAll() 后显示数据。我也试过使用 add() 但结果是一样的。我需要答案,因为我想非常了解 notifyDataSetChange() 的工作原理。
片段代码:
public static List<Wherehouse> mListFoodsIn;
wherehouseAdapter wherehouseAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_wherehouse, container, false);
wherehouseList = v.findViewById(R.id.wherehouseList);
final DBManager db = new DBManager(getActivity());
mListFoodsIn = new ArrayList<>();
wherehouseAdapter = new wherehouseAdapter(getActivity(), mListFoodsIn);
new GetWherehoouseAsync(getActivity(),mListFoodsIn, wherehouseList, wherehouseAdapter).execute();
wherehouseList.setAdapter(wherehouseAdapter);
异步class:
public static class GetWherehoouseAsync extends AsyncTask<Void, Void, Void>{
Context mContext;
wherehouseAdapter mAdapter;
DBManager db;
List<Wherehouse> mList;
ListView listViewWherehouse;
public GetWherehoouseAsync(Context mContext, List<Wherehouse> list, ListView lv, wherehouseAdapter adapter) {
this.mContext = mContext;
db = new DBManager(mContext);
this.mList = list;
this.listViewWherehouse = lv;
mAdapter = adapter;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
// List<Wherehouse> tmpList = db.GetWherehouse();
mList.addAll(db.GetWherehouse());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// mAdapter.notifyDataSetChanged();
}
这可能是很自然的情况,因为我在 onCreateView 中调用了 async()?
您在更新列表 mListFoodsIn
后将适配器应用于您的列表视图,因为您的数据来自数据库而不是通过网络调用,结果 returns 相对较快。因此,正确的列表会在创建时正确应用于列表视图。如果数据在片段的生命周期内发生变化,那么您需要通知适配器。
Notifies the attached observers that the underlying data has been
changed
notifyDataSetChanged 有问题。我有一个从 sqlite 数据库中检索数据的列表。问题是我知道每次使用列表 class 的添加方法时都必须调用 notifyDataSetChanged。我不明白为什么我的列表在没有 notifyDataSetChange() 的情况下调用 addAll() 后显示数据。我也试过使用 add() 但结果是一样的。我需要答案,因为我想非常了解 notifyDataSetChange() 的工作原理。 片段代码:
public static List<Wherehouse> mListFoodsIn;
wherehouseAdapter wherehouseAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_wherehouse, container, false);
wherehouseList = v.findViewById(R.id.wherehouseList);
final DBManager db = new DBManager(getActivity());
mListFoodsIn = new ArrayList<>();
wherehouseAdapter = new wherehouseAdapter(getActivity(), mListFoodsIn);
new GetWherehoouseAsync(getActivity(),mListFoodsIn, wherehouseList, wherehouseAdapter).execute();
wherehouseList.setAdapter(wherehouseAdapter);
异步class:
public static class GetWherehoouseAsync extends AsyncTask<Void, Void, Void>{
Context mContext;
wherehouseAdapter mAdapter;
DBManager db;
List<Wherehouse> mList;
ListView listViewWherehouse;
public GetWherehoouseAsync(Context mContext, List<Wherehouse> list, ListView lv, wherehouseAdapter adapter) {
this.mContext = mContext;
db = new DBManager(mContext);
this.mList = list;
this.listViewWherehouse = lv;
mAdapter = adapter;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
// List<Wherehouse> tmpList = db.GetWherehouse();
mList.addAll(db.GetWherehouse());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// mAdapter.notifyDataSetChanged();
}
这可能是很自然的情况,因为我在 onCreateView 中调用了 async()?
您在更新列表 mListFoodsIn
后将适配器应用于您的列表视图,因为您的数据来自数据库而不是通过网络调用,结果 returns 相对较快。因此,正确的列表会在创建时正确应用于列表视图。如果数据在片段的生命周期内发生变化,那么您需要通知适配器。
Notifies the attached observers that the underlying data has been changed