我有一个简单的列表视图,显示客户名称和年龄。列表需要滚动,我使行的背景交替颜色(白色和蓝色)。但是如果包含客户端年龄的单元格是18,我想以橙色突出显示,如果年龄为负,我想以红色突出显示(表示存在错误)。 一切正常,直到我开始滚动。在那一点上,一切都搞砸了,橙色/红色背景没有正确应用。 适配器代码如下。调试时我注意到变量 position 在每次迭代时都会改变值。例如,如果我最初只显示8行,滚动后我看到该位置转到9,10 ...然后5,4 ...我明白这可能是因为它重用了行但是我怎么能让它按预期工作?我希望有人可以提供帮助,因为我尝试了很多次,但仍然没有成功。谢谢。
class MyListViewAdapter : BaseAdapter<dbClient>
{
public List<dbClient> mItems;
private Context mContext;
private int mRowLayout;
private string[] mAlternatingColors;
// Default constructor
public MyListViewAdapter(Context context, List<dbClient> items, int rowLayout)
{
mItems = items;
mContext = context;
mRowLayout = rowLayout;
mAlternatingColors = new string[] { "#F2F2F2", "#00bfff" };
}
// Tells how many rows are in the dataset
public override int Count
{
get { return mItems.Count; }
}
// Return a row identifier
public override long GetItemId(int position)
{
return position;
}
// Return the data associated with a particular row
public override dbClient this[int position]
{
get { return mItems[position]; }
}
// Return a view for each row
public override View GetView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
if(row == null)
{
row = LayoutInflater.From(mContext).Inflate(Resource.Layout.listview_row, null, false);
}
row.SetBackgroundColor(Color.ParseColor(mAlternatingColors[position % mAlternatingColors.Length]));
TextView txtName = row.FindViewById<TextView>(Resource.Id.nameView);
txtName.Text = mItems[position].Name;
TextView txtAge = row.FindViewById<TextView>(Resource.Id.ageView);
txtAge.Text = mItems[position].Age.ToString();
// highlight if aged 18
if(txtAge.Text == "18")
{ txtAge.SetBackgroundColor(Color.Orange); }
// signale there is error in the age reported
if(txtAge.Text.Contains("-"))
{ txtAge.SetBackgroundColor(Color.Red); }
return row;
}
private Color GetColorFromInteger(int color)
{
return Color.Rgb(Color.GetRedComponent(color), Color.GetGreenComponent(color), Color.GetBlueComponent(color));
}
}
答案 0 :(得分:0)
在我开始滚动之前一切正常。在那一点上,一切都搞砸了,橙色/红色背景没有正确应用。
你重用行是正确的,所以在你的代码中,你出于不同的原因改变了颜色,并没有将它改回原来的颜色。只需要在// highlight if aged 18
if (txtAge.Text == "18")
{ txtAge.SetBackgroundColor(Color.Orange); }
// signale there is error in the age reported
else if (txtAge.Text.Contains("-"))
{ txtAge.SetBackgroundColor(Color.Red); }
// set back to default color
else
{
txtAge.SetBackgroundColor(Color.Black);
}
中更改部分代码,例如:
float moveFactor = drawerView.getWidth() * slideOffset;
container.setTranslationX(moveFactor);