获取listView自定义适配器中的父viewHolder

时间:2015-04-03 20:36:46

标签: android android-listview android-adapter

我有问题。我的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));
}

看起来像:

enter image description here

由于当前时间的原因,“白色”字段的数量每次都不同。

问题我需要增加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;
}

1 个答案:

答案 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);
    }

注意:

  1. 我在当前时间之后使用术语“AFTER”或相同。
  2. 我的设计理念是将行位置保存为timePosition后的简单变量。 afterTimePosition AFTER 行。将在代码if (afterTimePosition < position)中检查它以确定何时突出显示文本。我试着简化设计,这样我就不会轻易搞砸了。
  3. ArrayList数据需要将时间保存为整数或长整数。它只需要很少的内存。
  4. 代码for (int i= afterTimePosition...表示AFTER行或行项需要重新评估。我认为代码很容易理解。
  5. 让我们发布...