Android列表在适配器中滚动时查看重复值

时间:2015-03-27 12:13:09

标签: android android-listview

我将数据绑定到Android中的列表视图控件。数据存储在ArrayList中。在Adapter的getView()函数中,我得到包含23个项目的整个列表。如果' selectedval'是' 1',我将值设置为行中的TextView。

但是,尽管List包含23个唯一值,但我在View中看到重复值。在调试时,我看到值在滚动时重复。

以下是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 个答案:

答案 0 :(得分:3)

您创建视图的方式不正确。只有当convertView为null时,您才需要为新视图充气,但每次调用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;

}