GridView CustomAdapter notifyDataSetChanged 方法问题
GridView CustomAdapter notifyDataSetChanged method issue
我有一个 Fragment,使用 CustomAdapter(extending BaseAdapter)
加载了 GridView。数据是从服务器检索的,因此,一旦下载完成,我将尝试在适配器上调用 notifyDataSetChanged。但是,GridView 在下载后不加载内容。
以下是我的一些代码片段:
GridView gridview;
CustomAdapter mCustomAdapter;
List<Item> listItems = new ArrayList<Item>();
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
....
....
mCustomAdapter = new CustomAdapter(activity, listItems);
gridview = (GridView) view.findViewById(R.id.gridview);
gridview.setAdapter(mCustomAdapter);
// This is the call for retrieving data from Server
checkRefreshTimeAndGetData();
return view;
}
获取数据后,我在以下方法中调用 notifyDataSetChanged():
public void checkRefreshTimeAndGetData(){
....
....
listItems.clear();
if (!mMainTableDbAdapter.isTableEmpty(
prefs.getInt(Const.Prefs.MAIN_INDEX, DEFAULT_VALUE),
prefs.getInt(Const.Prefs.SUB_INDEX, DEFAULT_VALUE))){
listItems = mMainTableDbAdapter.getTitles(
prefs.getInt(Const.Prefs.MAIN_INDEX, DEFAULT_VALUE),
prefs.getInt(Const.Prefs.SUB_INDEX, DEFAULT_VALUE));
}
// At this point, i checked if listItems has values,
// and it has 100 items in it. So, its not empty.
mCustomAdapter.notifyDataSetChanged();
}
自定义适配器:
public class CustomAdapter extends BaseAdapter {
private List<Item> items;
private LayoutInflater vi;
private List<Boolean> selectedState = new ArrayList<Boolean>();
String imagepath = "";
int curPos = 0;
public CustomAdapter(Context context, List<Item> items) {
this.items = items;
vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView,
final ViewGroup parent) {
....
....
}
}
我做错了什么?如果需要任何其他数据,请告诉我。
这是一种出路
在你的 Adapter
中制作 refresh(..)
public void refresh(List<Item> items)
{
this.items = items;
notifyDataSetChanged();
}
并像
一样使用它
listItems.clear();
mCustomAdapter.refresh(listItems); //pass update list
您的代码无法正常工作的原因:
您没有使用最新数据更新适配器。在您的 checkRefreshTimeAndGetData
中,您获取了新数据,但没有将该数据提供给适配器。所以 mCustomAdapter.notifyDataSetChanged()
没有做任何事情。
为此,您可以在适配器中再添加一种方法,该方法会将项目更新到适配器中。
public void updateItems(List<Item> newItems) {
// Either you can add or replace all data
// Here I am replacing all data with new
this.items = newItems;
notifyDataSetChanged();
}
并在 mCustomAdapter.notifyDataSetChanged()
的位置将此方法调用到 checkRefreshTimeAndGetData
mCustomAdapter.updateItems(listItems);
您需要实现一个侦听器以了解何时下载数据。比如实现一个接口,当你成功从服务器获取数据时,它会收到通知,然后你调用 notifyDatasetChanged()
在当前情况下,您的方法只会在您启动片段时被调用。不是在下载数据时。
我有一个 Fragment,使用 CustomAdapter(extending BaseAdapter)
加载了 GridView。数据是从服务器检索的,因此,一旦下载完成,我将尝试在适配器上调用 notifyDataSetChanged。但是,GridView 在下载后不加载内容。
以下是我的一些代码片段:
GridView gridview;
CustomAdapter mCustomAdapter;
List<Item> listItems = new ArrayList<Item>();
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
....
....
mCustomAdapter = new CustomAdapter(activity, listItems);
gridview = (GridView) view.findViewById(R.id.gridview);
gridview.setAdapter(mCustomAdapter);
// This is the call for retrieving data from Server
checkRefreshTimeAndGetData();
return view;
}
获取数据后,我在以下方法中调用 notifyDataSetChanged():
public void checkRefreshTimeAndGetData(){
....
....
listItems.clear();
if (!mMainTableDbAdapter.isTableEmpty(
prefs.getInt(Const.Prefs.MAIN_INDEX, DEFAULT_VALUE),
prefs.getInt(Const.Prefs.SUB_INDEX, DEFAULT_VALUE))){
listItems = mMainTableDbAdapter.getTitles(
prefs.getInt(Const.Prefs.MAIN_INDEX, DEFAULT_VALUE),
prefs.getInt(Const.Prefs.SUB_INDEX, DEFAULT_VALUE));
}
// At this point, i checked if listItems has values,
// and it has 100 items in it. So, its not empty.
mCustomAdapter.notifyDataSetChanged();
}
自定义适配器:
public class CustomAdapter extends BaseAdapter {
private List<Item> items;
private LayoutInflater vi;
private List<Boolean> selectedState = new ArrayList<Boolean>();
String imagepath = "";
int curPos = 0;
public CustomAdapter(Context context, List<Item> items) {
this.items = items;
vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView,
final ViewGroup parent) {
....
....
}
}
我做错了什么?如果需要任何其他数据,请告诉我。
这是一种出路
在你的 Adapter
refresh(..)
public void refresh(List<Item> items)
{
this.items = items;
notifyDataSetChanged();
}
并像
一样使用它 listItems.clear();
mCustomAdapter.refresh(listItems); //pass update list
您的代码无法正常工作的原因:
您没有使用最新数据更新适配器。在您的 checkRefreshTimeAndGetData
中,您获取了新数据,但没有将该数据提供给适配器。所以 mCustomAdapter.notifyDataSetChanged()
没有做任何事情。
为此,您可以在适配器中再添加一种方法,该方法会将项目更新到适配器中。
public void updateItems(List<Item> newItems) {
// Either you can add or replace all data
// Here I am replacing all data with new
this.items = newItems;
notifyDataSetChanged();
}
并在 mCustomAdapter.notifyDataSetChanged()
checkRefreshTimeAndGetData
mCustomAdapter.updateItems(listItems);
您需要实现一个侦听器以了解何时下载数据。比如实现一个接口,当你成功从服务器获取数据时,它会收到通知,然后你调用 notifyDatasetChanged()
在当前情况下,您的方法只会在您启动片段时被调用。不是在下载数据时。