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_;
}
我不知道這是不是你的問題,但你應該在你的'開關/ case''break'聲明 – codeMagic
也許有更新QueueRows的更好方法? – karex
也許,但如果你在'break'語句中加入了'switch'中的其他代碼,肯定不會運行。你有沒有理由不在裏面? – codeMagic