Android SherlockListFragment不';在调用setListAdapter时不更新
我的SherlockListFragment有以下代码Android SherlockListFragment不';在调用setListAdapter时不更新,android,android-fragments,actionbarsherlock,android-arrayadapter,android-listfragment,Android,Android Fragments,Actionbarsherlock,Android Arrayadapter,Android Listfragment,我的SherlockListFragment有以下代码 public class RoutesListFragment extends SherlockListFragment { private ArrayList<Route> mItems; private static final String TAG = "ROUTES LIST"; RoutesAdapter mAdapter; @Override public View on
public class RoutesListFragment extends SherlockListFragment {
private ArrayList<Route> mItems;
private static final String TAG = "ROUTES LIST";
RoutesAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstaceState) {
View view = inflater.inflate(R.layout.fragment_main_lists, container,
false);
// When the setListAdapter is called here,
// it works without any problems
return view;
}
public void updateAdapter() {
// populate the list
mItems = Route.getRouteList();
Log.d(TAG, "Size of mItems : " + mItems.size());
mAdapter = new RoutesAdapter(getActivity(), R.layout.list_item_routes,
mItems);
this.setListAdapter(mAdapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Log.d(TAG, "Clicked item " + position);
}
private class RoutesAdapter extends ArrayAdapter<Route> {
private ArrayList<Route> mItems;
private Context mContext;
int mTextViewResource;
public RoutesAdapter(Context context, int textViewResource,
ArrayList<Route> items) {
super(context, textViewResource);
this.mItems = items;
this.mContext = context;
this.mTextViewResource = textViewResource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(mTextViewResource, null);
}
Route route = mItems.get(position);
((TextView) view.findViewById(R.id.route_name)).setText(route
.getRouteName());
((TextView) view.findViewById(R.id.route_number)).setText(Integer
.toString(route.getRouteNumber()));
((TextView) view.findViewById(R.id.direction)).setText(route
.getDirection().toString());
((TextView) view.findViewById(R.id.start_end)).setText(route
.getStartingStop() + " - " + route.getEndingStop());
return view;
}
}
}
公共类RouteListFragment扩展了SherlockListFragment{
私有数组列表;
私有静态最终字符串TAG=“路由列表”;
路线适应性;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
捆绑存储(不动产){
视图=充气机。充气(R.layout.fragment\u主列表、容器、,
假);
//在此处调用setListAdapter时,
//它工作没有任何问题
返回视图;
}
public void updatedapter(){
//填充列表
mItems=Route.getRouteList();
Log.d(标记“mItems的大小:”+mItems.Size());
mAdapter=新路由适配器(getActivity(),R.layout.list\u item\u routes,
螨类);
这个.setListAdapter(mAdapter);
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
Log.d(标签,“点击项目”+位置);
}
私有类路由适配器扩展了ArrayAdapter{
私有数组列表;
私有上下文;
int mtextview资源;
公共路由适配器(上下文、int textViewResource、,
ArrayList项目){
超级(上下文、textViewResource);
this.ms=项目;
this.mContext=上下文;
this.mtextviewsource=textviewsource;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
LayoutFlater充气器=(LayoutFlater)mContext
.getSystemService(上下文布局\充气机\服务);
视图=充气机。充气(mTextViewResource,null);
}
Route Route=mItems.get(位置);
((TextView)view.findviewbyd(R.id.route_name)).setText(route
.getRouteName());
((TextView)view.findViewById(R.id.route_number)).setText(整数
.toString(route.getRouteNumber());
((TextView)view.findViewById(R.id.direction)).setText(route
.getDirection().toString());
((TextView)view.findviewbyd(R.id.start\u end)).setText(route
.getStartingStop()+“-”+路由.getEndingStop());
返回视图;
}
}
}
更多细节
- 我已检查以确保
不是空的ArrayList mItems
函数从updateAdapter()
的AsyncTask
函数调用onPostExecute
- 此
用于SherlockListFragment
选项卡ViewPagerIndicator
- 当从onCreateView``函数调用
setListAdapter()时,它工作
您只需更改适配器中的数组,然后调用 adapter.notifyDataSetChanged()
我没有创建一个新的适配器,而是要补充jiduvah的答案 显然,
ArrayAdapter
有自己的ArrayList
项副本。所以。在调用mAdapter.notifyAll()之前,我必须先调用mAdapter.addAll(Route.getRouteList())
现在,updateAdapter
函数的代码为
public void updateAdapter() {
mAdapter.addAll(Route.getRouteList());
mAdapter.notifyDataSetChanged();
}
参考资料
我必须补充吉杜瓦的答案
显然,ArrayAdapter
有自己的ArrayList
项副本。所以。在调用mAdapter.notifyAll()之前,我必须先调用mAdapter.addAll(Route.getRouteList())
现在,updateAdapter
函数的代码为
public void updateAdapter() {
mAdapter.addAll(Route.getRouteList());
mAdapter.notifyDataSetChanged();
}
参考资料
谢谢!我现在就去试试。谢谢!现在开始尝试。这会将数组添加到现有数组的底部手动向mItems添加条目似乎不会更改ArrayAdapter正在使用的内容。不会。正如我在回答中所说,您需要更改适配器中的阵列。您可以在适配器中创建一个方法来更改阵列。这会将阵列添加到现有阵列的底部手动向mItems添加条目似乎不会更改ArrayAdapter正在使用的内容。不会。正如我在回答中所说,您需要更改适配器中的阵列。您可以在适配器中创建一个方法来更改数组。