ListView在用户交互之前不会刷新

时间:2014-01-13 11:47:39

标签: android listview notifydatasetchanged holoeverywhere

我有一个ListView和一个自定义适配器。当用户从微调器更改排序类型时,我想用新项重绘列表。问题是只有在我在设备上与它交互后才重新绘制ListView(例如,开始滚动)。

if (update) {
                mOfferList = (ArrayList<PositionSearchItem>) psr
                            .getPositionSearchItem();

                mAdapter.clear();
                mAdapter.addAll(mOfferList);
                mAdapter.notifydataSetChanged()
                mList.invalidate();
                mList.invalidateViews();

}

我还尝试将我的适配器的新实例完全重置到列表中,除了列表首先变为空白并出现在用户交互中之外,它给出了相同的结果。

我正在使用HoloEveryWhere这可能是一个重要信息。

编辑:这是一些更多的代码

@EFragment(R.layout.list_fragment_results)
public class ResultsListFragment extends Fragment {

    @ViewById(R.id.search_results_list)
    ListView mList;
    @ViewById(R.id.search_result_list_spinner)
    Spinner mSpinner;
    MainActivity mActivity;
    private String mTypedText;
    private List<String> mSortType;
    private ResultsListFragment mFrag;
    private Bundle mOffersPageBundle;
    private SearchResultsListAdapter mAdapter;
    private ArrayList<PositionSearchItem> mOfferList;

    @AfterViews
    public void afterViews() {
        mFrag = this;
        mActivity = (MainActivity) getActivity();
        mSortType = new ArrayList<String>();
        mSortType.add(SearchResultSortType.SCORE_DESCENDING);
        mOfferList = new ArrayList<PositionSearchItem>();

        mOffersPageBundle = getArguments();
        PositionSearchResponse psr = mOffersPageBundle.getParcelable("offers");
        mTypedText = mOffersPageBundle.getString("typedText");

        mOfferList = (ArrayList<PositionSearchItem>) psr.getPositionSearchItem();

        mAdapter = new SearchResultsListAdapter(this,
                android.R.layout.simple_list_item_1, mOfferList, mTypedText,
                mSortType, mActivity.getLat(), mActivity.getLon());
        mList.setAdapter(mAdapter);

        this.setListeners();
    }

    private void setListeners() {

        mSpinner.setOnItemSelectedListener(new org.holoeverywhere.widget.AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(
                    org.holoeverywhere.widget.AdapterView<?> parent, View view,
                    int pos, long id) {
                Boolean update = false;
                PositionSearchResponse psr = null;
                switch (pos) {
                case 0:
                    if (mSortType.get(0) != SearchResultSortType.SCORE_DESCENDING) {
                        mSortType.clear();
                        mSortType.add(SearchResultSortType.SCORE_DESCENDING);
                        psr = processSearch(mTypedText, mSortType, 0, mActivity);
                        update = true;
                    }
                    break;
                case 1:
                    if (mSortType.get(0) != SearchResultSortType.DATE) {
                        mSortType.clear();
                        mSortType.add(SearchResultSortType.DATE);
                        psr = processSearch(mTypedText, mSortType, 0, mActivity);
                        update = true;
                    }
                    break;

                default:
                    break;
                }

                if (update) {
                    mOffersPageBundle.putParcelable("offers", psr);
                    mOfferList = (ArrayList<PositionSearchItem>) psr
                            .getPositionSearchItem();

                    mAdapter.mIdMap.clear();
                    for (int i = 0; i < mOfferList.size(); ++i) {
                        mAdapter.mIdMap.put(mOfferList.get(i), i);
                    }

                    mOfferList = (ArrayList<PositionSearchItem>) psr
                            .getPositionSearchItem();

                    mAdapter.clear();
                    mAdapter.addAll(mOfferList);
                    mAdapter.notifydataSetChanged()
                    mList.invalidate();
                    mList.invalidateViews();
                }
            }

            @Override
            public void onNothingSelected(
                    org.holoeverywhere.widget.AdapterView<?> parent) {
                // TODO Auto-generated method stub

            }

        });
    }
}

编辑:自定义适配器的getView方法

@Override
public View getView(int pos, View convertView, ViewGroup parent) {
    this.v = convertView;
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
            Context.LAYOUT_INFLATER_SERVICE);
    PositionSearchItem psr = getItem(pos);

    v = vi.inflate(R.layout.result_list_item, parent, false);
    v.setTag(pos);
    // Inject text into view
    ((TextView) v.findViewById(R.id.result_title_textview))
            .setText(getItem(pos).getTitle());

    // Disable hardware acceleration for the view (it brakes dotted lines on
    // some devices)
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        v.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    // reload list if scrolled to bottom
    int page = 0;
    if (pos > mLastViewed && pos == getCount() - 1) {
        mLastViewed = pos;
        ResultsListFragment frag = new ResultsListFragment_();
        PositionSearchResponse newSearch = frag.processSearch(mTypedText, mSortType, mPage,
                mActivity);
        mPage = mPage + 12;

        if(newSearch != null && newSearch.getPositionSearchItem() != null && newSearch.getPositionSearchItem().size() > 0){
            for (int i = 0; i < newSearch.getPositionSearchItem().size(); ++i) {
                mIdMap.put(newSearch.getPositionSearchItem().get(i), i);
            }
            this.addAll(newSearch.getPositionSearchItem());
        }

    }
    return v;
}

3 个答案:

答案 0 :(得分:0)

使用

if (update) {

mAdapter.NotifyDataSetChanged();
}

答案 1 :(得分:0)

这可能会解决您的问题。

尝试再次设置adatpter。将以下代码放在您编写代码的所有位置以更新listview

mAdapter =  new YourAdapter();
mList.setAdapet(mAdapter)

答案 2 :(得分:0)

我希望您使用适配器和模型创建了自定义列表视图。

现在,每当您需要动态更新列表视图时,您需要清除以前创建的列表视图。然后,您需要获取所有新值,然后通过自定义列表视图更新它。

希望它有所帮助!