Список Android Просмотр повторяющихся значений при прокрутке в адаптере

Я связываю данные с элементом управления List View в Android. Данные хранятся в ArrayList. В функции getView() Адаптера я получаю весь список, состоящий из 23 элементов. Если 'selectedval' равен '1', я устанавливаю значения для TextView в строке.

Однако, несмотря на список, состоящий из 23 уникальных значений, я вижу повторяющиеся значения в представлении. При отладке я вижу, что значения дублируются при прокрутке.

Вот код для функции getView().

@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View mView = convertView;

    if (mView == null){
        mView = mInflator.inflate(R.layout.custom_rate_card, null);
        FancyTextview mTxtName = (FancyTextview)mView.findViewById(R.id.txt_list_name);
        FancyTextview mTxtPrice = (FancyTextview)mView.findViewById(R.id.txt_list_price);

        if(selectedVal == 0){
            String laundryPrice = mRateCardData.get(position).getLaundryPrice();
            if(Integer.parseInt(laundryPrice) != 0 && laundryPrice != null)
            {   
                mTxtName.setText(mRateCardData.get(position).getName());
                mTxtPrice.setText(laundryPrice);
            }
        }
        if(selectedVal == 1){
            String IPrice = mRateCardData.get(position).getIroningPrice();
            String Iname = mRateCardData.get(position).getName();
            if(Integer.parseInt(IPrice) != 0 && IPrice != null)
            {
                mTxtPrice.setText(IPrice);
                mTxtName.setText(Iname);
            }
        }
        return mView;
    }
    else{
        return mView;
    }
}

Я искал это и думаю, что это связано с переработкой вида. Но я не смог ее решить.

Любая помощь будет оценена. Благодарю.

1 ответ

Решение

То, как вы создаете представление, неверно. Вам нужно накачать новое представление, только если convertView имеет нулевое значение, но вам нужно устанавливать данные каждый раз, когда вызывается getView.

Я хотел бы предложить использовать шаблон Holder:

Ваш код должен выглядеть примерно так:

@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View mView = convertView;

    if (mView == null){
        mView = mInflator.inflate(R.layout.custom_rate_card, null);
        FancyTextview mTxtName = (FancyTextview)mView.findViewById(R.id.txt_list_name);
        FancyTextview mTxtPrice = (FancyTextview)mView.findViewById(R.id.txt_list_price);

     }
     if(selectedVal == 0){
        String laundryPrice = mRateCardData.get(position).getLaundryPrice();
        if(Integer.parseInt(laundryPrice) != 0 && laundryPrice != null)
        {   
            mTxtName.setText(mRateCardData.get(position).getName());
            mTxtPrice.setText(laundryPrice);
        }
    } else if (selectedVal == 1) {
        String IPrice = mRateCardData.get(position).getIroningPrice();
        String Iname = mRateCardData.get(position).getName();
        if(Integer.parseInt(IPrice) != 0 && IPrice != null)
        {
            mTxtPrice.setText(IPrice);
            mTxtName.setText(Iname);
        }
   }



   return mView;

}
Другие вопросы по тегам