#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. ошибка связана с вашим адаптером, попробуйте использовать пользовательский адаптер