ListView.Adapter возвращает ноль при назначении запроса - PullRequest
0 голосов
/ 09 февраля 2020

Я выбираю данные из таблицы собраний и назначаю им адаптер. При этом я получаю System.NullReferenceException: Ссылка на объект не установлена ​​на экземпляр объекта.

private void LoadData()
        {
            listSource = DBConnection.selectTable();
            var adapter = new ListViewAdapter(this, listSource);
            lstViewData.Adapter = adapter;
        }

static public List<Meeting> selectTable()
        {
            try
            {
                using (var connection = new SQLiteConnection(System.IO.Path.Combine(Folder, "Organizer.db")))
                {
                    return connection.Table<Meeting>().ToList();
                }
            }
            catch (SQLiteException ex)
            {
                Log.Info("SQLiteEx", ex.Message);
                return null;
            }
        }

protected override void OnCreate(Bundle savedInstanceState)
            {
                EditText passwordEditText = FindViewById<EditText>(Resource.Id.passwordEditText);
                lstViewData = FindViewById<ListView>(Resource.Id.listView);
            }

Структура таблицы собраний:

[Activity(Label = "AddEvent")]
    public class Meeting
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public int idLogin { get; set; }
        public int idContact { get; set; } 
        public string Place { get; set; }
        public string Comment { get; set; }
        public string Date { get; set; }
        public string Time { get; set; }
    }

Я делаю это по аналогии с этот проект: https://www.c-sharpcorner.com/article/xamarin-android-sqlite-database/

1 Ответ

0 голосов
/ 10 февраля 2020

Прежде всего, почему вы добавляете атрибут Activity выше Meeting, если Meeting не является действием, пожалуйста, удалите его.

Затем я написал демо об этом. Вот запущенный скриншот.

enter image description here

Если вы получаете System.NullReferenceException: Object reference not set to an instance of an object.

Пожалуйста, обратите внимание на свой ListView, если он нулевой, Если так, Вы должны переместить FindViewById из ListView выше LoadData метода.

    lstViewData = FindViewById<ListView>(Resource.Id.listView);
    edtidLogin = FindViewById<EditText>(Resource.Id.edtidLogin);
    edtidContact = FindViewById<EditText>(Resource.Id.edtidContact);
    edtPlace = FindViewById<EditText>(Resource.Id.edtPlace);
    var btnAdd = FindViewById<Button>(Resource.Id.btnAdd);


        db = new Database();
        db.createDatabase();

Вот мой код mainActivity.

     public class MainActivity : AppCompatActivity
{
    ListView lstViewData;
    List<Meeting> listSource = new List<Meeting>();
    Database db;
    EditText edtidLogin;
    EditText edtidContact;
    EditText edtPlace;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        lstViewData = FindViewById<ListView>(Resource.Id.listView);
         edtidLogin = FindViewById<EditText>(Resource.Id.edtidLogin);
         edtidContact = FindViewById<EditText>(Resource.Id.edtidContact);
         edtPlace = FindViewById<EditText>(Resource.Id.edtPlace);
        var btnAdd = FindViewById<Button>(Resource.Id.btnAdd);


        db = new Database();
        db.createDatabase();
      //  InsertData(db);


        btnAdd.Click += BtnAdd_Click;
        LoadData();
    }

    private void BtnAdd_Click(object sender, EventArgs e)
    {
    var meeting=    new Meeting() { idLogin= Int32.Parse( edtidLogin.Text), idContact= Int32.Parse(edtidContact.Text) , Place= edtPlace.Text };
        db.insertIntoTable(meeting);
        LoadData();
    }

    private void InsertData(Database db)
    {
        //throw new NotImplementedException();

        Meeting meeting = new Meeting() {
            idContact = 1,
            idLogin = 1,
            Place="Place1"
        };
         db.insertIntoTable(meeting);

        Meeting meeting2 = new Meeting()
        {
            idContact = 2,
            idLogin = 2,
            Place = "Place2"
        };
        db.insertIntoTable(meeting2);


        LoadData();
    }

    private void LoadData()
    {
        listSource = db.selectTable();
        var adapter = new ListViewAdapter(this, listSource);
        lstViewData.Adapter = adapter;
    }

Вот мое демо. https://github.com/851265601/ListviewAndSqlite

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