【问题标题】:Xamarin Android C#: Populate ListView Custom Row With Data From SQLite DatabaseXamarin Android C#:使用 SQLite 数据库中的数据填充 ListView 自定义行
【发布时间】:2017-06-18 16:59:16
【问题描述】:

我正在尝试创建一个 ListView,它从 SQLite 数据库(预先存在的 db 文件)提供数据。 ListView 使用自定义行,这是让我感到困惑的方面之一;如何提取数据,然后将其分配给自定义行中的 TextView?

我是 Xamarin 的新手,非常感谢您在这方面给我的任何指导,谢谢!

运行时当前对话框错误:

Java.Lang.ClassNotFoundException: Didn't find class      "md5c4f65b5cf99ab8e97737acf0f8ec7efd.DBHelper" on path: DexPathList[[zip file "/data/app/AppName.Droid-1/base.apk"],nativeLibraryDirectories=[/data/app/AppName.Droid-1/lib/arm, /system/fake-libs, /data/app/AppName.Droid-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]

'MainActivity':

public class EateriesActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        Title = "Find An Eatery";
        SetContentView(Resource.Layout.Eateries);


        DBHelper db = new DBHelper();
        db.CreateDatabase();
        db.CreateTable();

        var items = db.GetData();
        var listView = FindViewById<ListView>(Resource.Id.EateryList_ListView);

        listView.Adapter = new ArrayAdapter<string>(this, Resource.Layout.Eatery_ListView_Row, items);
    }
}

ListViewAdapter(这个有必要吗?):

class ListViewAdapter : BaseAdapter<Eatery>
{
    private List<Eatery> myItems;
    private Context myContext;
    public ListViewAdapter(Context context, List<Eatery> items)
    {
        myItems = items;
        myContext = context;
    }
    public override int Count
    {
        get { return myItems.Count; }
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override Eatery this[int position]
    {
        get
        {
            return myItems[position];
        }
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;

        if (row == null)
        {
            row = LayoutInflater.From(myContext).Inflate(Resource.Layout.Eatery_ListView_Row, null, false);
        }

        TextView placeName = row.FindViewById<TextView>(Resource.Id.placeName);
        placeName.Text = myItems[position].Name;

        TextView placeTown = row.FindViewById<TextView>(Resource.Id.placeTown);
        placeTown.Text = myItems[position].Town;

        return row;
    }
}

餐馆:

public class Eatery
{
    [PrimaryKey]
    public string ID { get; set; }
    public string Image { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address1 { get; set; }
    public string Town { get; set; }
    public string PostCode { get; set; }
    public string Cuisine { get; set; }
}

DBHelper:

public class DBHelper
{
    private static string DB_PATH = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    private static string DB_NAME = "EateryDB.db";

    public void CreateDatabase()
    {
        string dbPath = Path.Combine(DB_PATH, DB_NAME);
        var db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), dbPath);
    }

    public void CreateTable()
    {
        string dbPath = Path.Combine(DB_PATH, DB_NAME);
        var db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), dbPath);
        db.CreateTable<Eatery>();
    }

    public List<string> GetData()
    {
        string dbPath = Path.Combine(DB_PATH, DB_NAME);
        var db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), dbPath);
        List<string> data = new List<string>();
        foreach (var item in db.Table<Eatery>())
        {
            var place = item.Name.ToString(); item.Town.ToString();

            data.Add(place);
        }
        return data;
    }

【问题讨论】:

  • 您实际上是在问如何连接到 SQlite 数据库并从中获取数据?
  • @GraceFeng-MSFT 嗨。它实际上并不是我在将检索到的数据分配给自定义 ListView 行中的 TextView 的方法上遇到问题。如果很明显,您能否为我的问题发布一个可能的解决方案,非常感谢您的帮助吗?我已经更新了帖子中的代码。谢谢。

标签: c# android sqlite listview xamarin


【解决方案1】:

根据您的两个版本的代码,我认为您需要将数据库中的数据添加到myItems

然后你可以例如这样的代码:

List<Eatery> data = new List<Eatery>();
foreach (var item in db.Table<Eatery>())
{
     var place = item.Name.ToString();
     var location = item.Location.ToString();
     var rating = item.Rating;
     item.Town.ToString();
     data.Add(new Eatery() { PlaceName = place, PlaceLocation = location, PlaceRating = rating });
}

最后将这些数据添加到您的适配器中,就像您在硬编码时所做的那样:

MyListViewAdapter adapter = new MyListViewAdapter(this, data);

【讨论】:

  • 您好,感谢您的回答。我将第一段代码添加到 DBHelper 中的 addData() 方法中,然后将 ListViewAdapter 类引用添加到 EateryActivity。还有别的事吗?我收到了与帖子顶部所述相同的错误。
  • @E.Coder,您的错误提示您的DBHelper 类找不到,它为空,您是否正确初始化它?
  • 我已经在 Main Activity 中启动了它...到目前为止我所做的是否正确,或者您会建议以不同的方式连接到数据库吗?
  • 我不太明白你的回答...我是把“适配器”代码放在 Main Activity 中还是放在 MyListViewAdapter 类中?再次感谢。
  • @E.Coder,不,在你的EateriesActivity 中,只需检查问题中的早期版本代码,我的意思是你可以简单地用你的数据库中的数据替换你的假数据。
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多