【问题标题】:Android - Check custom listView items on the start of the AppAndroid - 在应用程序开始时检查自定义 listView 项目
【发布时间】:2018-06-07 16:42:44
【问题描述】:

我有一个自定义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; }
    }
}
}

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

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

但是当这段代码被执行时,之前检查过的项目会被检查,并且用户之前没有检查过的其他项目也会被检查。那么如何在应用程序开始时检查Listview 中先前检查的项目?请帮助我找到解决方案。

【问题讨论】:

  • 您可以将用户的选择存储在本地存储(Sqlite、Realm、文件等)中,并在应用程序启动时检索它们。示例:docs.microsoft.com/en-us/xamarin/android/data-cloud/data-access/…
  • 我已经为您删除了visual-studio 标签,因为这不是关于 Visual Studio 开发环境的问题(请参阅标签 wiki)
  • @SushiHangover 是的,我正在使用 Sqlite 保存它们,但我没有在我的代码中显示,我问的是检索。我无法在活动开始时检索它们。
  • I am not able to retrieve them on the start of the activity 是什么意思?我想首先在Application 中获取数据,因为Application 是在Android 中运行的第一个类。您可以在 Application 类中将 useritems 定义为全局变量。
  • @JoeLv-MSFT 是的useritems 已经是一个全球列表,但我没有把它放在我的问题代码中。这就是我想要做的:用户第一次检查他的项目,让他们是德国和法国,然后他就很喜欢这个应用程序。然后他重新打开它,他需要在 Listview 中看到他之前检查过的项目(德国和法国)自动检查,所以他不需要再次重新检查它们。

标签: c# android list listview xamarin


【解决方案1】:

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

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

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

关于数据库,我使用SQLite.Net。我正在使用DBHelper 操作数据库。

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

我已更新demoHere 是 gif。

【讨论】:

  • 好吧,我已经尝试了游览解决方案,当我第一次运行该应用程序时,我的listview 中没有任何项目。这是为什么 ?另外,我已经将 usercoin 保存在 database 中,所以如果你可以通过假设它保存在数据库中来编辑你的代码并且你只是从中取出它。
  • when I first run the app, I am getting no items in my listview,好的,我明天测试一下,但我现在不明白你的问题。所以,我建议,明天,我会调试我的演示,并推送它,你可以和你的比较。你可以问我关于我的代码的任何问题。或者显示有关读取数据库的代码,这样我就可以找到您无法从数据库中获取数据的原因。
  • 好的,我将提供如何将用户币保存到database 虽然我的方法不容易理解,但它很复杂。请明天查看我的更新代码并编辑您的演示以适合我的代码。
  • 我刚刚更新了我的代码,请查看它。每次应用启动时,splash.cs 都会启动,然后用户币列表会加载项目
  • 假设我想签入“法国”可用的列表视图。这样做的代码是什么?如何使此代码与自定义列表视图一起使用:for (int i = 0; i &lt;= useritems.Count; i++) { listView.SetItemChecked(i, true); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多