奇怪的 ListAdapter 行为
Strange ListAdapter behavior
我正在使用 BaseAdapter
来显示一些项目。
我不想更改位置为零的项目的文本。
所以我的 BaseAdapter
的 getView
方法看起来像
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 时显式设置期望值。
我正在使用 BaseAdapter
来显示一些项目。
我不想更改位置为零的项目的文本。
所以我的 BaseAdapter
的 getView
方法看起来像
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 时显式设置期望值。