I have some problems with a ListView
(it's more of a visual problem), it remembers data such as text values from TextViews
, from the ListView
's rows, but tangles or forgets aspects regarding the TextViews
background color.
The problem shows up only when the ListView
contains many rows. I work with a SimpleCursorAdapter
and a ViewBinder
and want to highlight a TextView
if a condition occurs:
In the ViewBinder
implementation:
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
CharSequence display;
if(view.getId() == R.id.dueDate){
long timestamp = Long.parseLong(cursor.getString(3));
display=DateUtils.getRelativeTimeSpanString(timestamp);
if(timestamp+DaysToMillis(5)> new Date().getTime())
((TextView) view).setBackgroundResource(R.color.marker_red);
((TextView) view).setText(display);
return true;
}
else
return false;
}
So again: when there are many rows the ListView
seems to tangle the background color. Some times when I re-scroll, it change's again the TextView
's background and I can't seem to find the bug or the ListView
's logic.
So, does the setViewValue(..)
method gets called every time before inflating a row? Even if you scroll up or down 开发者_StackOverflowand a row that's not visible anymore get's visible again? Or the setViewValue(..)
method gets called just for a initial row inflating process and then the created objects are keept in the ListView
's memory?
P.S. The text values from the same TextView
is displayed correctly. I used the same logic in the same setViewValue(..)
method.
Same newbie
It seems to me (and if I'm wrong please correct me... especially if you are Roman Guy) that ViewBinder, with it's setViewValue method recycles the listView's rows...
setViewValue(..) gets called for every "FROM - TO" binding for every row displayed, even for rows that were already inflated, and by scrolling up/down they got displayed again;
and regarding my amassing piece of code, for a row that gets displayed again:
((TextView) view).setText(display);
- will set the correct content, same timestamp will get processed... but if it doesn't passes the:if(timestamp+DaysToMillis(5)> new Date().getTime()) ((TextView) view).setBackgroundResource(R.color.marker_red);
-the current TextView might have for background the background from a recycled TextViewanyways I had to add an
else ((TextView) view).setBackgroundResource(0);
to myif
精彩评论