2017-05-05 16 views
0

クライアントの名前と年齢を示す簡単なリストビューがあります。リストはスクロールする必要があり、私は行の背景の代替色(白と青)を作った。しかし、クライアントの年齢を含むセルが18の場合は、オレンジ色で強調表示したいので、年齢が負の場合は赤で強調表示したい(エラーがあることを知らせるため)。 スクロールを開始するまではすべて正常に動作します。その時点では、オレンジ/赤の背景が正しく適用されていないため、すべてがうんざりしています。 アダプタコードは以下のとおりです。デバッグ中に、変数の位置が各繰り返しで値を変更することに気付きました。たとえば、最初に8行しか表示しない場合は、スクロールした後、その位置が9,10、...、5、4になるのがわかります。行が再利用されている可能性があると思いますが、 ?私は多くの時間をかけたが、まだ成功しなかったので、誰かが助けてくれることを願っています。ありがとうございました。Xamarinは、セルが再利用されているときにリストビュー内のセルを強調表示します。

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); 
} 
関連する問題