在 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

我也试图找到 .

的用途

编辑: WhiteDirty 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);
    }

备注:

  1. 我使用的术语 AFTER 表示当前时间之后或相同时间。
  2. 我的设计思路是将行位置保存到简单的变量afterTimePosition中。 afterTimePositionAFTER 行。它将在代码 if (afterTimePosition < position) 中检查以确定何时突出显示文本。我在设计上尽量简单,这样我就不会轻易混淆。
  3. ArrayList datas需要以整型或长整型保存时间。它只需要很少的内存。
  4. 带有 for (int i= afterTimePosition... 的代码表示 AFTER 行或行项目需要重新评估。我认为代码很容易理解。

让我们知道...