0

ListView とカスタム アダプターがあります。ユーザーがスピナーから並べ替えタイプを変更すると、新しいアイテムでリストを再描画したいと思います。問題は、デバイス上で 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

            }

        });
    }
}

EDIT : カスタム アダプターからの 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;
}
4

3 に答える 3

0

使用する

if (update) {

mAdapter.NotifyDataSetChanged();
}
于 2014-01-13T11:49:23.523 に答える