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

            }

        });
    }
}

РЕДАКТИРОВАТЬ: метод 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;
}

person TrtG    schedule 13.01.2014    source источник
comment
используйте 1_   -  person Viswanath Lekshmanan    schedule 13.01.2014
comment
Извините, я просто забыл это в своем посте. Я использую это на самом деле.   -  person TrtG    schedule 13.01.2014
comment
Хорошо, тогда опубликуйте код еще немного, например, откуда вы это вызываете, и когда происходит обновление   -  person Viswanath Lekshmanan    schedule 13.01.2014
comment
Вы можете обновить его на Spinner ItemSelected, просто проверьте мой ответ, надеюсь, он сработает для вас.   -  person Chirag Ghori    schedule 13.01.2014


Ответы (3)


Использовать

if (update) {

mAdapter.NotifyDataSetChanged();
}
person Viswanath Lekshmanan    schedule 13.01.2014

это может решить вашу проблему.

Попробуйте снова установить адаптер. Поместите приведенный ниже код во все места, где вы написали код, чтобы обновить список.

mAdapter =  new YourAdapter();
mList.setAdapet(mAdapter)
person Athul    schedule 13.01.2014
comment
Я пробовал это также. У него такое же поведение, за исключением того, что он выдает пустой список перед взаимодействием с пользователем. - person TrtG; 13.01.2014
comment
Вы написали какой-либо код анимации в адаптере списка, просто спросив, поскольку у меня была такая же проблема при загрузке списка с анимацией записи..? - person Athul; 13.01.2014
comment
И не могли бы вы добавить функцию getview в пост.? - person Athul; 13.01.2014
comment
Нет, я не устанавливал на него анимацию. Я добавил метод getView. - person TrtG; 13.01.2014

Надеюсь, вы создали собственное представление списка, используя адаптер и модель.

Теперь каждый раз, когда вам нужно динамически обновлять представление списка, вам нужно очищать ранее созданное представление списка. Затем после того, как вам нужно получить все новые значения, а затем обновить их в пользовательском представлении списка.

Надеюсь, поможет!

person AndroidHacker    schedule 13.01.2014