2015-04-03 54 views
1

我遇到问题。我的ListView控件中包含有2组划分项目:在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)); 
} 

它看起来像:

enter image description here

“白”字段的金额每次不同,由于当前时间。

而且问题是我需要增加textSize,使BoldLAST白场(见显着的领域)。

如何从自定义适配器执行此操作?


我试了一下:

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的用法。


编辑:污白色项目的量不同,每次适配器,因为在服务器.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

值会根据当前的时间?这会让它变得更加复杂。我没有看到它的代码。同时,我会考虑一下。我喜欢解决算法。 – 2015-04-04 00:47:53

+1

我没有看到setTag用于getView()的父级。但是,您可以使用viewHolder而不是父视图。而且你无论如何都要在TextView上设置字体大小/样式。 – 2015-04-04 01:00:09

+0

@The原始Android,感谢提供提示。但是,我应该如何以及在哪里将标签设置为parentHolder? – AnZ 2015-04-04 07:58:39

回答

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. 我使用期满后的当前时间或相同的含义之后。
  2. 我的设计思路是将行位置保存到afterTimePosition后的简单变量中。 afterTimePositionAFTER行。它将在代码if (afterTimePosition < position)中检查以确定何时突出显示文本。我试图在设计上做到简单,以免让人感到困惑。
  3. ArrayList数据需要保存整数或长整型的时间。它只需要少量的内存。
  4. 代码for (int i= afterTimePosition...,表示AFTER行或行项目需要重新评估。我认为代码很容易理解。

保持我们张贴...设置为0的状态

相关问题