【问题标题】:Strange ListAdapter behavior奇怪的 ListAdapter 行为
【发布时间】:2016-05-22 06:46:54
【问题描述】:

我正在使用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;
}

但我的输出是

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

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

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

提前致谢。

【问题讨论】:

  • 如果position == 0你想做什么?
  • 我不想改变写在TextViews 中的值从item_bill 布局文件
  • 你不能依赖那个逻辑。您需要为 0 位置设置默认值。
  • K,我会这样做并让你知道它是否有效..
  • 非常感谢您的帮助..它工作并得到了这背后的逻辑..在接受的答案中解释

标签: android baseadapter listadapter


【解决方案1】:

你的问题是 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 中设置默认值或另一个值,如果您没有将其设置为发生回收机制,您的值会在滚动后随一个随机位置发生变化。

EDIT :: 参考图片了解详情

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

在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 ViewHolder {
    TextView textDate;
    TextView textPaidAmount;
}

【讨论】:

  • 非常感谢..它解决了我的问题,并且我得到了为什么它返回第一个位置的最后一个值的逻辑......非常感谢..
  • 在适配器类中最好使用 ViewHolder 模式,我将使用 ViewHolder 模式编辑代码,
【解决方案2】:

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

当位置 ==0 时,您应该明确设置预期值。

【讨论】:

    【解决方案3】:

    我也遇到过这个问题,

       In position 0 pass textView = "" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2015-07-20
      • 2010-10-03
      • 2021-07-12
      • 2013-10-04
      相关资源
      最近更新 更多