首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android -在应用程序启动时检查自定义listView项目

Android -在应用程序启动时检查自定义listView项目
EN

Stack Overflow用户
提问于 2018-06-08 00:42:44
回答 1查看 93关注 0票数 0

我有一个自定义的Listview,每行包含一个textview和一个复选框。我将所选行的textview的值(或文本)保存在名为usercoin的公用列表中。每次用户打开应用程序时,列表usercoin都会包含his textview selected items的文本,我正在使用SQLite来实现。问题是我想要重新检查用户以前选择的usercoin列表中可用的项目。我不能这样做。

MyActivity.cs

代码语言:javascript
复制
    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; }
    }
}
}

例如,当用户运行应用程序并从listview中选择FranceGermany时,下次打开该应用程序时,usercoin列表将包含FranceGermany。现在的问题是如何在listview中选中与这些值对应的复选框。我试图通过在MyAdapter : BaseAdapter类中包含以下代码来做到这一点:

代码语言:javascript
复制
if (Class1.usercoin.Contains(item.CoinAbr))
            {
                Class1.adapter[(int)holder.cb.Tag].bl = true;
                this.NotifyDataSetChanged();
            }

但是当执行这段代码时,会检查以前选中的项目,以及用户以前没有检查过的其他项目。那么,我如何在应用程序启动时检查Listview中之前选中的项目?请帮我找到一个解决方案。

EN

回答 1

Stack Overflow用户

发布于 2018-06-12 15:27:49

我已经在DataBase和内存中存储了数据(useritems)。

如果您的应用程序被系统或用户终止,您可以从DataBase恢复数据。

如果你的应用程序不是被系统或用户杀死的,而是用户跳转到其他活动,当他回到这个活动时,你可以使用内存来恢复数据。

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

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

我已经更新了demoHere是gif。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50746357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档