奇怪的ListAdapter行为

时间:2016-05-22 06:46:55

标签: android baseadapter listadapter

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

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

getView的{​​{1}}方法看起来像

BaseAdapter

但我的输出是

Output

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

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

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

提前致谢。

3 个答案:

答案 0 :(得分: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中设置默认值或其他值,如果你没有设置为回收机制,你的值在滚动后随着一个随机位置改变了。

编辑::请参阅图片以获取详细信息

Details

最好在适配器类中使用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;
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我也遇到了这个问题,

   In position 0 pass textView = ""