当重复使用细胞时,Xamarin会突出显示listview中的细胞

时间:2017-05-05 22:13:34

标签: c# android listview xamarin

我有一个简单的列表视图,显示客户名称和年龄。列表需要滚动,我使行的背景交替颜色(白色和蓝色)。但是如果包含客户端年龄的单元格是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));
    }
}

1 个答案:

答案 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);