我有问题。我的listView包含分为2组的项目:
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));
}
看起来像:
由于当前时间的原因,“白色”字段的数量每次都不同。
问题我需要增加textSize
并使Bold
最后白色字段(请参见标记字段)。
如何从自定义适配器执行此操作?
我尝试了什么:
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
我也尝试使用this post。
修改
每次创建适配器时, White 和 Dirty white 项目的数量会因当前时间.getStatus()
在服务器上发生更改而变化。它可以是“之前”(如果开始时间<当前时间)和“之后”(当前时间<开始时间)。
我需要标记这个项目,这就是“现在”,即第一个“之后”。
整个适配器(更新):
@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;
}
答案 0 :(得分:1)
我建议我认为最终应该起作用的代码/设计。它可能与您现有的代码设计类似,但我没有看到数据列表设置“之前”或“之后”状态的代码。无论我使用的是“之后”的术语,并试图避免更改很多代码。
建议代码:
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);
}
注意:
afterTimePosition
是 AFTER 行。将在代码if (afterTimePosition < position)
中检查它以确定何时突出显示文本。我试着简化设计,这样我就不会轻易搞砸了。for (int i= afterTimePosition...
表示AFTER行或行项需要重新评估。我认为代码很容易理解。让我们发布...