与适配器持有者混淆,如何防止 getView 方法修改不适当的 ListView 行?
Confusion with adapter holder, how can I prevent getView method from modifying inappropriate ListView rows?
我对 ListView 中使用的自定义适配器一无所知。特别是我的意思是 holder class,它适用于保存指定的行数据。我有一个 ArrayList,其中有 NewsItem objects。 NewsItem object 有一些字符串字段,例如标题,时间戳等。这个 class 有布尔值叫做 page_separator_flag,这个问题就是围绕这个特定的变量。根据此值,ListView 中的行项目会更改其背景并隐藏一些信息。
我了解到,当我将 holder 用于我的适配器时,我将防止不必要的行更改。所以我创建了名为 NewsItemHolder 的持有人,它有一些字段可以保留特定行的视图,并且它也有类似的“page_separator_flag” .根据我的研究,我认为我可以通过 if 语句控制行外观。
不幸的是,一些我不想更改的行已更改(尤其是当我快速滚动 ListView object 时)。
我的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 class:
static class NewsItemHolder {
boolean page_separator_flag;
ImageView newsPicture;
TextView newsTimestamp;
TextView newsTitle;
LinearLayout newsItemLayout;
}
正如您在上面提到的 if 语句中看到的,当标题视图包含 "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
}
我对 ListView 中使用的自定义适配器一无所知。特别是我的意思是 holder class,它适用于保存指定的行数据。我有一个 ArrayList,其中有 NewsItem objects。 NewsItem object 有一些字符串字段,例如标题,时间戳等。这个 class 有布尔值叫做 page_separator_flag,这个问题就是围绕这个特定的变量。根据此值,ListView 中的行项目会更改其背景并隐藏一些信息。
我了解到,当我将 holder 用于我的适配器时,我将防止不必要的行更改。所以我创建了名为 NewsItemHolder 的持有人,它有一些字段可以保留特定行的视图,并且它也有类似的“page_separator_flag” .根据我的研究,我认为我可以通过 if 语句控制行外观。
不幸的是,一些我不想更改的行已更改(尤其是当我快速滚动 ListView object 时)。
我的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 class:
static class NewsItemHolder {
boolean page_separator_flag;
ImageView newsPicture;
TextView newsTimestamp;
TextView newsTitle;
LinearLayout newsItemLayout;
}
正如您在上面提到的 if 语句中看到的,当标题视图包含 "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
}