2013-06-21 44 views
0

我有一個ListView包含3種類型的元素。行和QueueRows是一些有點複雜的子控件,而HeaderRow只包含textView。 我所做的是添加HeaderRow,少量QueueRows,headerRow和幾行。 QueueRow需要每秒更新一次。這就是爲什麼我編寫了一個在適配器上調用notifyDataSetChanged的代碼。它每秒更新一次queuerow,但也有一個問題 - 我的兩個標題會切換到半秒鐘。 每0.5秒後他們互換。你有什麼想法如何預防他們?Android的列表視圖行更改值

這是我的代碼:

class BuildingsAdapter extends ArrayAdapter<BaseRow> { 

private static Bitmap SOURCE_BITMAP; 

private MainActivity mainActivity_; 

private Handler handler_; 
private Runnable runnable_; 

public BuildingsAdapter(MainActivity mainActivity) { 

    super(mainActivity, R.layout.row); 
    this.mainActivity_ = mainActivity; 
    SOURCE_BITMAP = BitmapFactory.decodeResource(
      mainActivity_.getResources(), R.drawable.images); 
    handler_ = new Handler(); 
    runnable_ = new Runnable() { 

     @Override 
     public void run() { 

      notifyDataSetChanged(); 
      if (hasQueueItems()) 
       handler_.postDelayed(runnable_, 1000); 
     } 
    }; 
} 

@Override 
public void add(BaseRow object) { 

    if (!hasQueueItems() && object.getClass().equals(QueueRow.class)) 
     handler_.postDelayed(runnable_, 1000); 
    super.add(object); 
} 

private boolean hasQueueItems() { 

    for (int i = 0; i < getCount(); ++i) { 
     if (getItem(i).getClass().equals(QueueRow.class)) 
      return true; 
    } 

    return false; 
} 

@Override 
public int getItemViewType(int position) { 

    return getItem(position).getType(); 
} 

@Override 
public int getViewTypeCount() { 

    return 3; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    int type = getItemViewType(position); 

    View row = convertView; 

    switch (type) { 
    case BaseRow.QUEUE_ROW: { 
     QueueRowViewHolder holder = new QueueRowViewHolder(); 
     //whatever 
        return convertView; 
    } 
    case BaseRow.ROW: { 
     RowViewHolder holder = new RowViewHolder(); 
     //whatever 
        return convertView; 
    } 
    case BaseRow.HEADER_ROW: { 
     HeaderViewHolder holder = new HeaderViewHolder(); 
     if (row == null) { 
      LayoutInflater inflater = (LayoutInflater) getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.header_row, parent, false); 

      HeaderRow headerRow = (HeaderRow) getItem(position); 

      holder.nameTextView_ = (TextView) row 
        .findViewById(R.id.categoryNameTextView); 
      holder.nameTextView_.setText(headerRow.getName()); 

      row.setTag(holder); 
     } else { 
      holder = (HeaderViewHolder) row.getTag(); 
     } 
     return row; 
    } 
    } 
    return null; 
} 

static class QueueRowViewHolder { 

    ImageView qItemImageView_; 
    TextView qItemNameTextView_; 
    ProgressBar qProgressBar_; 
    TextView qLevelTextView_; 
    TextView qTimeTextView_; 
    int position_; 
} 

static class RowViewHolder { 

    ImageView itemImageView_; 
    TextView nameTextView_; 
    TextView levelTextView_; 
    TextView woodTextView_; 
    TextView ironTextView_; 
    TextView stoneTextView_; 
    TextView goldTextView_; 
    Button actionButton_; 
    TextView timeTextView_; 
} 

static class HeaderViewHolder { 

    TextView nameTextView_; 
} 
+0

我不知道這是不是你的問題,但你應該在你的'開關/ case''break'聲明 – codeMagic

+0

也許有更新QueueRows的更好方法? – karex

+0

也許,但如果你在'break'語句中加入了'switch'中的其他代碼,肯定不會運行。你有沒有理由不在裏面? – codeMagic

回答

0

好!我發現它了 - 我沒有設置HeaderRow的值;)