ListView中最后一项的ImageViews的奇怪行为

时间:2013-01-19 20:31:02

标签: android android-listview android-imageview

我有一个带有自定义适配器的ListView。在每一行中都有一个只在某些约束条件下可见的ImageView。问题是,如果第一行显示此ImageView,那么它也适用于最后一行,反之亦然。

以下是我的适配器的getView()代码。

public View getView(int position, View view, ViewGroup parent) {
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.row_idea, null);
    }

    Idea idea = mIdeas.get(position);

    if (idea != null) {
        ImageView imgAlarm = (ImageView) view
                .findViewById(R.id.imgAlarm_rowIdea);
        if (idea.getTimeReminder() != null)
            imgAlarm.setVisibility(ImageView.VISIBLE);

        TextView lblTitle = (TextView) view
                .findViewById(R.id.lblTitle_rowIdea);
        lblTitle.setText(idea.getTitle());

        TextView lblDescription = (TextView) view
                .findViewById(R.id.lblDescription_rowIdea);
        lblDescription.setText(idea.getDescription());
    }
    return view;
}

mIdeasArrayList,其中包含要在ListView中显示的所有数据。 imgAlarm是我在上面说过的ImageView

2 个答案:

答案 0 :(得分:2)

如果条件不满足,您将需要还原ImageView的可见性状态,这样您就不会遇到潜在的回收视图问题(可能已ImageView已显示当它不应该出现时:)

if (idea.getTimeReminder() != null) {
     imgAlarm.setVisibility(ImageView.VISIBLE);
} else {
    imgAlarm.setVisibility(ImageView.INVISIBLE); // or GONE
}

答案 1 :(得分:2)

更改

if (idea.getTimeReminder() != null)
            imgAlarm.setVisibility(ImageView.VISIBLE);

if (idea.getTimeReminder() != null)
            imgAlarm.setVisibility(ImageView.VISIBLE);
else
            imgAlarm.setVisibility(ImageView.GONE);

这里发生的是适配器正在“回收”视图。因此,如果您在测试中看到,最后一个视图和第一个视图实际上是同一个实例。