在活动开始时检查自定义列表视图项

时间:2018-06-20 11:49:23

标签: c# android list listview xamarin

我在C# Android中有一个自定义的Listview,每行包含一个textview和一个checkbox。我将所选行的textview的值(或文本)保存在名为usercoin的公共列表中。每次用户打开该应用程序时,列表用户币将包含他的textview所选项目的文本,而我正在使用SQLite进行操作。问题是我想重新检查活动开始时user先前自动选择的项目,这些项目已存储在usercoin list中,如我先前所述。但是我无法实现这一目标。

MainActivity.cs

 ListView mListView;
MyAdapter adapter;
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.activity_main);
    mListView = FindViewById<ListView>(Resource.Id.listview);
    List<TableList> list = new List<TableList>();

    list.Add(new TableList("Germany",false));
    list.Add(new TableList("France", false));
    list.Add(new TableList("Finland", false));
    list.Add(new TableList("Germany", false));
    list.Add(new TableList("France", false));
    list.Add(new TableList("Germany", false));
    list.Add(new TableList("France", false));
    list.Add(new TableList("Finland", false));

    adapter = new MyAdapter(this, list);
    mListView.Adapter = adapter;
    mListView.ItemClick += MListView_ItemClick;
}

private void MListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
    var t = list[e.Position];
    string selected = t.name;
    var ll = e.View as LinearLayout;
    var cb = ll.GetChildAt(2) as CheckBox;
    if (cb.Checked)
    {
        cb.Checked = false;
        adapter.changeState((int)cb.Tag, false);
    }
    else
    {
        cb.Checked = true;
        adapter.changeState((int)cb.Tag, true);
    }
}



class MyAdapter : BaseAdapter
{
    Context mContext;
    List<TableList> mitems;
    public MyAdapter(Context context, List<TableList> list)
    {
        this.mContext = context;
        this.mitems = list;

    }
    public override int Count
    {
        get
        {
            return mitems.Count;
        }
    }

    public override Java.Lang.Object GetItem(int position)
    {
        return mitems[position];
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        DataViewHolder holder = null;
        if (convertView == null)
        {
            convertView = LayoutInflater.From(mContext).Inflate(Resource.Layout.CoinList, null, false);
            holder = new DataViewHolder();
            holder.tv = convertView.FindViewById<TextView>(Resource.Id.CoinName);
            holder.iv = convertView.FindViewById<ImageView>(Resource.Id.imageView1);
            holder.cb = convertView.FindViewById<CheckBox>(Resource.Id.checkBox1);
            convertView.Tag = holder;
        }
        else
        {
            holder = convertView.Tag as DataViewHolder;

        }
        holder.cb.Tag = position;

        holder.tv.Text = mitems[position].Name;
        holder.cb.Focusable = false;
        holder.cb.Checked = mitems[position].bl;
        holder.iv.SetImageResource(Resource.Drawable.dapao);
        holder.cb.CheckedChange += Cb_CheckedChange;
        return convertView;

    }

    private void Cb_CheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
    {
        var cb = sender as CheckBox;
        if (e.IsChecked && !mitems[(int)cb.Tag].bl)
        {
            mitems[(int)cb.Tag].bl = true;
            this.NotifyDataSetChanged();
        }
        else if (!e.IsChecked && mitems[(int)cb.Tag].bl)
        {
            mitems[(int)cb.Tag].bl = false;
            this.NotifyDataSetChanged();
        }
    }

    internal void changeState(int tag, bool v)
    {
        mitems[tag].bl = v;
        this.NotifyDataSetChanged();
    }
}

public class DataViewHolder : Java.Lang.Object
{
    public ImageView iv { get; set; }
    public TextView tv { get; set; }
    public CheckBox cb { get; set; }

}
public class TableList : Java.Lang.Object
{
    private string v;



    public TableList(string name, bool b)
    {
        this.Name = name;
        this.bl = b;
    }
    public string Name { get; set; }
    public bool bl { get; set; }
}
}
}

例如,当用户首次运行应用程序并从France中选择Germanylistview时,下次他重新打开应用程序时,usercoin列表将包含法国和德国。现在的问题是如何检查与checkboxes中的那些值相对应的listview。我试图通过在MyAdapter : BaseAdapter class中包含以下代码来做到这一点:

if (Class1.usercoin.Contains(item.CoinAbr))
        {
            Class1.adapter[(int)holder.cb.Tag].bl = true;
            this.NotifyDataSetChanged();
        }

但是,当执行此代码时,将检查先前检查过的项目,同时还会检查用户以前未检查过的其他一些项目。那么,如何在应用启动时检查Listview中先前检查过的项目?请帮助我找到解决方案。

0 个答案:

没有答案