【发布时间】: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 中选择France 和Germany 时,他下次打开应用程序时,usercoin 列表将包含France 和Germany。现在的问题是如何检查与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