Android - проверка пользовательских элементов списка просмотра в начале приложения - PullRequest
0 голосов
/ 07 июня 2018

У меня есть пользовательский 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 и Germanyиз listview, в следующий раз, когда он откроет приложение, список usercoin будет содержать France и Germany.Теперь вопрос в том, как установить флажки, соответствующие этим значениям в listview.Я попытался сделать это, включив этот код в MyAdapter : BaseAdapter class:

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

Но когда этот код выполняется, проверяются ранее проверенные элементы плюс некоторые другие элементы, которые пользователь ранее не проверялТакже проверены.Так как же проверить ранее проверенные элементы в Listview при запуске приложения?Пожалуйста, помогите мне найти решение.

1 Ответ

0 голосов
/ 12 июня 2018

Я сохранил данные (useritems) как в базе данных, так и в памяти.

Если ваше приложение уничтожено системой или пользователем, вы можете восстановить данные из базы данных.

ЕслиВаше приложение не уничтожается системой или пользователем, но пользователь переходит к другой активности, когда он возвращается к этой активности, вы можете использовать память для восстановления данных.

О базе данных, я использую SQLite.Net .Я использую DBHelper для работы с базой данных.

И я добавил класс приложения в приложение.

Я обновил demo . Здесь - это рисунок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...