Android SherlockListFragment不';在调用setListAdapter时不更新

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

我的SherlockListFragment有以下代码

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()


您只需更改适配器中的数组,然后调用

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正在使用的内容。不会。正如我在回答中所说,您需要更改适配器中的阵列。您可以在适配器中创建一个方法来更改数组。