0

对于我的 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;
        }

    }
}

更多细节

  • 我已经检查以确保它ArrayList<Route> mItems不为空。

  • updateAdapter()函数onPostExecuteAsyncTask.

  • SherlockListFragmentViewPagerIndicator选项卡中使用。

  • 它在setListAdapter() is called from theonCreateView`` 函数时起作用。

4

2 回答 2

3

您可以更改适配器中的数组,然后调用

适配器.notifyDataSetChanged();

而不是创建一个新的适配器

于 2013-01-10T16:52:38.677 回答
1

我必须添加到 jiduvah 的答案。

显然它ArrayAdapter有它自己的项目副本ArrayList<Route>。所以。我必须先打电话mAdapter.addAll(Route.getRouteList())再打电话mAdapter.notifyAll()

现在updateAdapter函数的代码是。

public void updateAdapter() {
    mAdapter.addAll(Route.getRouteList());
    mAdapter.notifyDataSetChanged();
}

参考

列表视图未使用 notifydatasetchanged() 调用进行更新

于 2013-01-11T00:30:51.353 回答