在 listView 自定义适配器中获取父 viewHolder
Get parent viewHolder in listView custom adapter
我有问题。我的 listView 包含分为两组的项目:
if (datas.get(position).getStatus().equalsIgnoreCase("after")) {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
} else {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
}
看起来像:
由于当前时间,"white" 字段的数量每次都不同。
而问题是我需要增加textSize
并使Bold
成为LAST白场(请参阅标记的字段)。
如何从自定义适配器执行此操作?
我尝试了什么:
private int state = 0;
....
if (datas.get(position).getStatus().equalsIgnoreCase("after")) {
if (state == 0) {
//Make parent placeholder Bold here
parentHolder = (ViewHolder) parent.getTag();
parentHolder.postNameView.setTypeface(null, Typeface.BOLD);
parentHolder.postTimeView.setTypeface(null, Typeface.BOLD);
parentHolder.postNameView.setTextSize(24);
parentHolder.postTimeView.setTextSize(24);
state++;
}
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
} else {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
}
所以状态只会有一次为 0。但是 parentHolder = (ViewHolder) parent.getTag();
不起作用。是null
我也试图找到 .
的用途
编辑:
White 和 Dirty white 项目的数量在每次创建适配器时都会有所不同,因为 .getStatus()
由于当前时间在服务器上发生变化。它可以是"before"(如果开始时间<当前时间)和"after"(当前时间<开始时间)。
我需要标记那个项目,有点像"now",即第一个"after"。
整个适配器(已更新):
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.channel_listview_item, null);
viewHolder = new ViewHolder();
viewHolder.postNameView = (TextView) convertView.findViewById(R.id.channel_listview_item_name);
viewHolder.postTimeView = (TextView) convertView.findViewById(R.id.channel_listview_item_time);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (datas.get(position).getStatus().equalsIgnoreCase("before")) {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
} else {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
//perform this 'if' only once at this position
if (/*need such condition that occurs only for ONCE*/) {
viewHolder.postNameView.setTypeface(null, Typeface.BOLD);
viewHolder.postTimeView.setTypeface(null, Typeface.BOLD);
viewHolder.postNameView.setTextSize(24);
viewHolder.postTimeView.setTextSize(24);
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
}
}
viewHolder.postNameView.setText(datas.get(position).getTitle());
viewHolder.postTimeView.setText(datas.get(position).getStart());
return convertView;
}
}
static class ViewHolder {
TextView postTimeView;
TextView postNameView;
}
我已经建议 code/design 我认为最终应该可行。它可能类似于您现有的代码设计,但我没有看到 datas 列表设置 "before" 或 "after" 状态的代码。不管我使用的是您的 "after" 术语,还是尽量避免更改太多代码。
建议代码:
int afterTimePosition = 0;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
...
if (convertView == null) {
...
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (position > afterTimePosition) {
// Re-evaluate the AFTER line, MAY need to change it
int currentTime = Server.getTime(); // replace getTime with a proper method call
// Check time only after the AFTER line.
// Need datas to save the date/time.
if (datas.get(afterTimePosition).getTime() < currentTime) {
// Need to change the AFTER line by evaluating time in the ArrayList against current time
for (int i= afterTimePosition; i <= position; i++) {
if (datas.get(i).getTime() >= currentTime) {
afterTimePosition = i;
break; // found the new AFTER line
}
}
} // if datas...
}
if (afterTimePosition < position) {
// BEFORE border line
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
} else {
// AFTER border line
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTypeface(null, Typeface.BOLD);
viewHolder.postTimeView.setTypeface(null, Typeface.BOLD);
}
备注:
- 我使用的术语 AFTER 表示当前时间之后或相同时间。
- 我的设计思路是将行位置保存到简单的变量afterTimePosition中。
afterTimePosition
是 AFTER 行。它将在代码 if (afterTimePosition < position)
中检查以确定何时突出显示文本。我在设计上尽量简单,这样我就不会轻易混淆。
- ArrayList datas需要以整型或长整型保存时间。它只需要很少的内存。
- 带有
for (int i= afterTimePosition...
的代码表示 AFTER 行或行项目需要重新评估。我认为代码很容易理解。
让我们知道...
我有问题。我的 listView 包含分为两组的项目:
if (datas.get(position).getStatus().equalsIgnoreCase("after")) {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
} else {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
}
看起来像:
由于当前时间,"white" 字段的数量每次都不同。
而问题是我需要增加textSize
并使Bold
成为LAST白场(请参阅标记的字段)。
如何从自定义适配器执行此操作?
我尝试了什么:
private int state = 0;
....
if (datas.get(position).getStatus().equalsIgnoreCase("after")) {
if (state == 0) {
//Make parent placeholder Bold here
parentHolder = (ViewHolder) parent.getTag();
parentHolder.postNameView.setTypeface(null, Typeface.BOLD);
parentHolder.postTimeView.setTypeface(null, Typeface.BOLD);
parentHolder.postNameView.setTextSize(24);
parentHolder.postTimeView.setTextSize(24);
state++;
}
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
} else {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
}
所以状态只会有一次为 0。但是 parentHolder = (ViewHolder) parent.getTag();
不起作用。是null
我也试图找到
编辑:
White 和 Dirty white 项目的数量在每次创建适配器时都会有所不同,因为 .getStatus()
由于当前时间在服务器上发生变化。它可以是"before"(如果开始时间<当前时间)和"after"(当前时间<开始时间)。
我需要标记那个项目,有点像"now",即第一个"after"。
整个适配器(已更新):
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.channel_listview_item, null);
viewHolder = new ViewHolder();
viewHolder.postNameView = (TextView) convertView.findViewById(R.id.channel_listview_item_name);
viewHolder.postTimeView = (TextView) convertView.findViewById(R.id.channel_listview_item_time);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (datas.get(position).getStatus().equalsIgnoreCase("before")) {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
} else {
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
//perform this 'if' only once at this position
if (/*need such condition that occurs only for ONCE*/) {
viewHolder.postNameView.setTypeface(null, Typeface.BOLD);
viewHolder.postTimeView.setTypeface(null, Typeface.BOLD);
viewHolder.postNameView.setTextSize(24);
viewHolder.postTimeView.setTextSize(24);
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
}
}
viewHolder.postNameView.setText(datas.get(position).getTitle());
viewHolder.postTimeView.setText(datas.get(position).getStart());
return convertView;
}
}
static class ViewHolder {
TextView postTimeView;
TextView postNameView;
}
我已经建议 code/design 我认为最终应该可行。它可能类似于您现有的代码设计,但我没有看到 datas 列表设置 "before" 或 "after" 状态的代码。不管我使用的是您的 "after" 术语,还是尽量避免更改太多代码。
建议代码:
int afterTimePosition = 0;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
...
if (convertView == null) {
...
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (position > afterTimePosition) {
// Re-evaluate the AFTER line, MAY need to change it
int currentTime = Server.getTime(); // replace getTime with a proper method call
// Check time only after the AFTER line.
// Need datas to save the date/time.
if (datas.get(afterTimePosition).getTime() < currentTime) {
// Need to change the AFTER line by evaluating time in the ArrayList against current time
for (int i= afterTimePosition; i <= position; i++) {
if (datas.get(i).getTime() >= currentTime) {
afterTimePosition = i;
break; // found the new AFTER line
}
}
} // if datas...
}
if (afterTimePosition < position) {
// BEFORE border line
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.white));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.white));
} else {
// AFTER border line
viewHolder.postTimeView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTextColor(getResources().getColor(R.color.text_not_highlighted));
viewHolder.postNameView.setTypeface(null, Typeface.BOLD);
viewHolder.postTimeView.setTypeface(null, Typeface.BOLD);
}
备注:
- 我使用的术语 AFTER 表示当前时间之后或相同时间。
- 我的设计思路是将行位置保存到简单的变量afterTimePosition中。
afterTimePosition
是 AFTER 行。它将在代码if (afterTimePosition < position)
中检查以确定何时突出显示文本。我在设计上尽量简单,这样我就不会轻易混淆。 - ArrayList datas需要以整型或长整型保存时间。它只需要很少的内存。
- 带有
for (int i= afterTimePosition...
的代码表示 AFTER 行或行项目需要重新评估。我认为代码很容易理解。
让我们知道...