Android - 检查应用程序开始时的自定义listView项

时间:2018-06-07 16:42:44

标签: c# android list listview xamarin

我有自定义Listview,每行包含一个textview和一个复选框。我将所选行的textview的值(或文本)保存在名为usercoin的公共列表中。每次用户打开应用时,列表usercoin都会包含其textview个所选项目的文本,而我正在使用SQLite进行此操作。问题是我想重新检查一下美国人之前选择的usercoin列表中可用的项目。我无法这样做。

MyActivity.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列表将包含{ {1}}和France。现在的问题是如何查看Germany中与这些值对应的复选框。我试图通过将此代码包含在listview类:

中来实现
MyAdapter : BaseAdapter

但是当执行此代码时,将检查先前检查的项目以及用户之前未检查过的一些其他项目。那么如何在应用启动的if (Class1.usercoin.Contains(item.CoinAbr)) { Class1.adapter[(int)holder.cb.Tag].bl = true; this.NotifyDataSetChanged(); } 中查看以前检查过的项目?请帮我找一个解决方案。

1 个答案:

答案 0 :(得分:0)

我已将数据(useritems)存储在数据库和内存中。

如果您的应用被系统或用户杀死,您可以从DataBase恢复数据。

如果您的应用未被系统或用户杀死,但用户跳转到其他活动,则当他回到此活动时,您可以使用内存来恢复数据。

关于DataBase,我使用的是SQLite.Net。我正在使用DBHelper来操作DataBase。

我在应用程序中添加了Application类。

我已更新demoHere是gif。