奇怪的 ListAdapter 行为

Strange ListAdapter behavior

我正在使用 BaseAdapter 来显示一些项目。

我不想更改位置为零的项目的文本。

所以我的 BaseAdaptergetView 方法看起来像

public View getView(int position, View view, ViewGroup parent) {
    try {
        if(view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.item_bill, parent, false);
        }
        Log.e("BillAdapter", "Position :: " + position);
        if(position == 0) {
            Log.e("BillAdapter", "Position zero. Not changing values....");
        } else {
            Bill bill = items.get(position);
            Log.e("BillAdapter", position + " :: " + bill.toString());
            TextView textDate = (TextView) view.findViewById(R.id.text_date);
            textDate.setText(bill.getDate());
            TextView textPaidAmount = (TextView) view.findViewById(R.id.text_paid_amount);
            textPaidAmount.setText(String.format("%2.2f", bill.getPaidAmount()));
        }
    } catch (Exception ex) {
        Log.e("BillAdpater", Log.getStackTraceString(ex));
    }
    return view;
}

但我的输出是

我在我的所有应用程序中都使用了相同的逻辑并且它有效。我不知道这有什么问题。

它反映了第一个位置的最后一个值。

我尝试重建项目、清理项目,但没有成功。

提前致谢。

我也遇到了这个问题,

   In position 0 pass textView = "" 

你的问题是ListView的回收机制。请阅读 this 以获取更多信息。

您可以通过在 if 语句中设置数据来解决您的问题,因此您的 getView 必须像:

try {
        if(view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.item_bill, parent, false);
        }
        Log.e("BillAdapter", "Position :: " + position);
        TextView textDate = (TextView) view.findViewById(R.id.text_date);
        TextView textPaidAmount = (TextView) view.findViewById(R.id.text_paid_amount);

        if(position == 0) {
            textDate.setText("Date");
            textPaidAmount.setText("Paid Amount");
        } else {
            Bill bill = items.get(position);
            Log.e("BillAdapter", position + " :: " + bill.toString());
            textDate.setText(bill.getDate());

            textPaidAmount.setText(String.format("%2.2f", bill.getPaidAmount()));
        }
    } catch (Exception ex) {
        Log.e("BillAdpater", Log.getStackTraceString(ex));
    }

当你在 listView 的 if 语句中设置一个信息时,你必须在 else 中设置默认值或另一个值,如果你不设置它,因为回收机制发生了,你的值在滚动后随机位置发生变化。

编辑 :: 详细理解请参考图片

最好在您的适配器中使用 ViewHolder 模式 class: 您可以使用以下代码。

在 getView 中使用:

 try {

       ViewHolder viewHolder;

       if(view == null) {
           view = LayoutInflater.from(context).inflate(R.layout.item_bill, parent, false);
           viewHolder = new ViewHolder();
           viewHolder.textPaidAmount = (TextView) view.findViewById(R.id.text_paid_amount);
           viewHolder.textDate =  (TextView) view.findViewById(R.id.text_date);

            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }

            Log.e("BillAdapter", "Position :: " + position);

            if(position == 0) {
                holder.textDate.setText("Date");
                holder.textPaidAmount.setText("Paid Amount");
            } else {
                Bill bill = items.get(position);
                Log.e("BillAdapter", position + " :: " + bill.toString());
                holder.textDate.setText(bill.getDate());
                holder.textPaidAmount.setText(String.format("%2.2f", bill.getPaidAmount()));
            }
        } catch (Exception ex) {
            Log.e("BillAdpater", Log.getStackTraceString(ex));
        }

并且 ViewHolder class 是:

class ViewHolder {
    TextView textDate;
    TextView textPaidAmount;
}

View 参数是一个重复使用的实例。 Android 出于性能原因重用。

您应该在位置 ==0 时显式设置期望值。