java - 与适配器持有者混淆,如何防止 getView 方法修改不适当的 ListView 行?

标签 java android android-layout android-listview android-arrayadapter

我不知道 ListView 中使用的自定义适配器。我特别指的是holder类,它适合保存指定的行数据。我有一个 ArrayList ,其中有 NewsItem 对象。 NewsItem 对象有一些字符串字段,例如标题、时间戳等。此类有名为 page_separator_flag 的 boolean 值,这个问题是围绕这个特定的多变的。根据此值,ListView 中的行项目会更改其背景并隐藏一些信息。

我读到,当我使用适配器的支架时,我将防止对行进行不必要的更改。因此,我创建了名为 NewsItemHolder 的持有者,它有一些字段来保留特定行的 View ,并且它也有类似的“page_separator_flag”。根据我的研究,我认为我可以通过 if 语句控制行外观。

不幸的是,我不想更改的一些行已更改(尤其是当我快速滚动 ListView 对象时)。

我的 getView 方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    NewsItemHolder holder = new NewsItemHolder();

    if(rowView == null) {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        rowView = inflater.inflate(layoutResourceId, parent, false);

        holder.newsPicture = (ImageView)rowView.findViewById(R.id.newsPicture);
        holder.newsTimestamp = (TextView)rowView.findViewById(R.id.newsTimestamp);
        holder.newsTitle = (TextView)rowView.findViewById(R.id.newsTitle);
        holder.newsItemLayout = (LinearLayout)rowView.findViewById(R.id.newsLayout);

        // Setting font
        holder.newsTimestamp.setTypeface(typeface);
        holder.newsTitle.setTypeface(typeface);

        rowView.setTag(holder);
    }
    else {
        holder = (NewsItemHolder) rowView.getTag();
    }

        String tests = (String)holder.newsTitle.getText();

        NewsItem single_item = items.get(position);
        holder.newsTimestamp.setText(single_item.getTimestamp());
        holder.newsTitle.setText(single_item.getTitle());
        holder.page_separator_flag = single_item.page_separator_flag;

        // For page headers there is a special treatment
       // if (holder.page_separator_flag == true) {
        if(holder.newsTitle.getText().toString().contains("Page") && holder.page_separator_flag == true) {
            holder.newsPicture.setVisibility(View.GONE);
            holder.newsTimestamp.setVisibility(View.GONE);
            holder.newsItemLayout.setBackground(context.getResources().getDrawable(R.drawable.background_card_page));
            holder.newsTitle.setTextSize(Float.valueOf(holder.newsTitle.getTextSize()) * 0.50f);
            holder.newsTitle.setTextColor(Color.WHITE);
        }
        // Load picture using Picasso (we haven't to focus on caching and preventing re-download)
        Picasso.with(context).load(single_item.getImgURL()).placeholder(R.mipmap.ic_empty_news).into(holder.newsPicture);


    return rowView;
}

我的 NewsItemHolder 类:

static class NewsItemHolder {
    boolean page_separator_flag;

    ImageView newsPicture;
    TextView newsTimestamp;
    TextView newsTitle;
    LinearLayout newsItemLayout;
}

正如您在上面提到的 if 语句中看到的,当标题 View 包含“Page”一词时(这是关于将一​​组数据与另一组数据分开),行外观将会改变。 不幸的是,正如我所说,它会影响不是页面分隔符并包含所需数据的行。

当holder出现故障时,如何正确处理?我做错了什么?

最佳答案

你也必须处理其他情况,否则它不会工作

if(holder.newsTitle.getText().toString().contains("Page ") && holder.page_separator_flag == true) {
        holder.newsPicture.setVisibility(View.GONE);
        holder.newsTimestamp.setVisibility(View.GONE);
        holder.newsItemLayout.setBackground(context.getResources().getDrawable(R.drawable.background_card_page));
        holder.newsTitle.setTextSize(Float.valueOf(holder.newsTitle.getTextSize()) * 0.50f);
        holder.newsTitle.setTextColor(Color.WHITE);
    }
else {
YOUR DEFAULT VALUES WHEN BOOLEAN IS FALSE
}

关于java - 与适配器持有者混淆,如何防止 getView 方法修改不适当的 ListView 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770126/

相关文章:

android - 如何获取 Canvas 像素

java - 膨胀 MaterialAnimatedSwitch 时出错

android - java.lang.IllegalStateException : The specified child already has a parent

android - 如何阻止长文本加宽按钮

java - 如何在eclipse中获取conf.txt路径

java - 当我尝试删除多个选定的行时;只有少数被删除,并非全部

java - 将许多语句加载到 Jena 数据集中的最有效方法是什么?

java - Hibernate session.save() 总是返回 1

android - 找不到 GoogleApiClient 类错误

android - 我们可以在 android 中播放 .vtt 文件以获得字幕吗?