Как реализовать сохраненный массив объектов в ListView Android

#java #android #listview #arraylist

#java #Android #listview #arraylist

Вопрос:

Мое задание — создать приложение, которое реализует компонент ListView, Button и EditText, и пользователь должен иметь возможность добавлять значения, хранящиеся в массиве объектов (Contacts), в ListView с помощью кнопки. Кроме того, я должен использовать SQLite для сохранения этих значений в ListView. Я полагаю, что я правильно настроил обработчик базы данных, хотя это может быть проблемой, но я думаю, что проблема в том, что мой адаптер ArrayList не работает должным образом.

MainActivity.java

 package com.example.classthirtynine;

import androidx.appcompat.app.AppCompatActivity;
import com.example.classthirtynine.DatabaseHandler;
import com.example.classthirtynine.Contact;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Button;
import android.widget.ListView;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Button button;
    private EditText editText;
    private ListView listView;
    private ArrayList<String> contactArrayList;
    private ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final DatabaseHandler db = new DatabaseHandler(MainActivity.this);

        button = (Button) findViewById(R.id.button);
        editText = (EditText) findViewById(R.id.editText);
        listView = (ListView) findViewById(R.id.listview);

        contactArrayList = new ArrayList<>();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Contact contactModel = new Contact();
                contactModel.setName(editText.getText().toString());
                db.addContact(contactModel);

            }
        });

        ArrayList<Contact> contacts = db.getAllContacts();

        //DISPLAY ALL CONTACTS
        for(Contact contact : contacts)
        {
            Log.d("Contacts", "ID: "   contact.getId()   " NAME: "   contact.getName());
            contactArrayList.add(contact.getName());
        }

        //PRINT COUNT
        Log.d("Count", ""   db.getContactCount());

        //ARRAY ADAPTER FOR LISTVIEW
        arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contactArrayList);
        listView.setAdapter(arrayAdapter);

        //EVENT LISTENER FOR LISTVIEW
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                Toast.makeText(MainActivity.this, "You clicked on "   contactArrayList.get(position), Toast.LENGTH_SHORT).show();
            }
        });

    }
}
 

DatabaseHandler.java

 package com.example.classthirtynine;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

import com.example.classthirtynine.Contact;
import com.example.classthirtynine.Util;

import java.util.ArrayList;

public class DatabaseHandler extends SQLiteOpenHelper
{

    public DatabaseHandler(@Nullable Context context)
    {
        super(context, Util.DATABASE_NAME, null, Util.DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        //CREATE TABLE contacts(id INTEGER PRIMARY KEY, name TEXT, email TEXT)
        String query = "CREATE TABLE "   Util.TABLE_NAME   "("   Util.KEY_ID   " INTEGER PRIMARY KEY,"
                  Util.KEY_NAME   " TEXT"   ")";

        //db.execSQL("CREATE TABLE contacts(id INTEGER PRIMARY KEY, name TEXT, email TEXT)");
        db.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {

    }

    public void addContact(Contact contact)
    {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(Util.KEY_NAME, contact.getName());

        db.insert(Util.TABLE_NAME, null, values);
        db.close();
    }

    public Contact getContact(int id)
    {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(Util.TABLE_NAME, new String[]{Util.KEY_ID, Util.KEY_NAME},
                Util.KEY_ID   "=?", new String[]{String.valueOf(id)}, null, null, null );

        if(cursor != null)
            cursor.moveToFirst();

        Contact contact = new Contact();

        contact.setId(Integer.parseInt(cursor.getString(0)));
        contact.setName(cursor.getString(1));

        return contact;
    }

    public void updateContact(Contact contact)
    {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(Util.KEY_NAME, contact.getName());

        //update(Table Name, Values, Where ID = ?)
        db.update(Util.TABLE_NAME, values, Util.KEY_ID   "=?", new String[]{String.valueOf(contact.getId())});
        db.close();
    }

    public void deleteContact(Contact contact)
    {
        SQLiteDatabase db = this.getWritableDatabase();

        db.delete(Util.TABLE_NAME, Util.KEY_ID   "=?", new String[]{String.valueOf(contact.getId())});

        db.close();
    }

    public ArrayList<Contact> getAllContacts()
    {
        ArrayList<Contact> contacts = new ArrayList();

        SQLiteDatabase db = this.getReadableDatabase();

        String query = "SELECT * FROM "   Util.TABLE_NAME;

        Cursor cursor = db.rawQuery(query, null);

        if(cursor.moveToFirst())
        {
            do {
                Contact contact = new Contact();

                contact.setId(Integer.parseInt(cursor.getString(0)));
                contact.setName(cursor.getString(1));

                contacts.add(contact);
            } while(cursor.moveToNext());
        }

        return contacts;
    }
    public int getContactCount()
    {
        String query = "SELECT * FROM "   Util.TABLE_NAME;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(query, null);

        return cursor.getCount();
    }
}
 

Заранее благодарим вас за помощь!

Комментарии:

1. можете ли вы поделиться, в чем проблема, в частности, что вы имели в виду, когда ArrayAdapter не работал? Элемент добавлен в адаптер, но не виден в ListView или что-то еще?

2. ошибка связана с вашим адаптером, попробуйте использовать пользовательский адаптер