Java ArrayAdapter SQLite和customListView
我正在android studio中为我的作业构建一个基本购物清单应用程序。我对Java非常陌生,在从SQLite传递数据时,我对ArrayAdapter非常困惑。请看一下我的代码,我会尽力解释我面临的问题=( DatabaseHelper类Java ArrayAdapter SQLite和customListView,java,android,sqlite,android-arrayadapter,Java,Android,Sqlite,Android Arrayadapter,我正在android studio中为我的作业构建一个基本购物清单应用程序。我对Java非常陌生,在从SQLite传递数据时,我对ArrayAdapter非常困惑。请看一下我的代码,我会尽力解释我面临的问题=( DatabaseHelper类 package com.puyakul.prin.psychic_shopping; import android.content.ContentValues; import android.content.Context; import android.
package com.puyakul.prin.psychic_shopping;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "shoppinglist";
private static final int DN_VERSION = 2;
public DatabaseHelper(Context context){
super (context,DB_NAME, null, DN_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sqlLists = "CREATE TABLE lists(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR)";
String sqlItems = "CREATE TABLE items(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, list_id INTEGER, FOREIGN KEY(list_id) REFERENCES lists(id))";
db.execSQL(sqlLists);
db.execSQL(sqlItems);
}
public boolean addLists(String name){
//Open database
SQLiteDatabase db = getReadableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
db.insert("lists", null, contentValues);
//Close database
db.close();
return true;
}
public boolean addListsItem(String name, int id){
//Open database
SQLiteDatabase db = getReadableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
contentValues.put("list_id", id);
db.insert("items", null, contentValues);
//Close database
db.close();
return true;
}
public int deleteItem (String id){
SQLiteDatabase db= getReadableDatabase();
return db.delete("item", "ID = ?", new String[] {id});
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sqlLists = "DROP TABLE IF EXISTS lists";
String sqlItems = "DROP TABLE IF EXISTS items";
db.execSQL(sqlLists);
db.execSQL(sqlItems);
onCreate(db);
}
public Cursor getList(){
SQLiteDatabase db = this.getReadableDatabase();
String sql = "SELECT * FROM lists";
return db.rawQuery(sql, null);
}
public Cursor getListDetail(int id){
SQLiteDatabase db = this.getReadableDatabase();
String sql = "SELECT items.name FROM items WHERE items.list_id = '" + id + "'";
//String sql = "SELECT items.name FROM items INNER JOIN lists ON lists.id=items.list_id WHERE items.list_id = '" + id + "'";
return db.rawQuery(sql,null);
}
public Cursor getListID(String name){
SQLiteDatabase db = this.getReadableDatabase();
String sql = "SELECT ID FROM lists WHERE name = '" + name + "'";
return db.rawQuery(sql, null);
}
}
MainListDetail类
package com.puyakul.prin.psychic_shopping;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.Time;
import java.util.ArrayList;
import java.util.List;
public class MainListsDetail extends AppCompatActivity {
private Button btn_deleteItem, btn_editListName;
private EditText editText_ListName, editText_addNewItemName;
private TextView textView_listName;
private ListView ListView_ListDetail;
private DatabaseHelper db;
private String selectedList;
private int selectedID;
public ArrayList<String> listDetailData = new ArrayList<>();
//Time stamp code, matching current time zone
//private Time today = new Time(Time.getCurrentTimezone());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_lists_detail);
//declare layout elements
ListView_ListDetail = findViewById(R.id.ListView_ListDetail);
textView_listName = findViewById(R.id.textVie_listName);
editText_addNewItemName = findViewById(R.id.editText_addNewItemName);
//declare database
db = new DatabaseHelper(this);
//get the intent extra from MainListView
Intent receivedIntent = getIntent();
//now get the listID we passed on extra
selectedID = receivedIntent.getIntExtra("id",0); // -1 for the default value
//now get the name we passed on extra
selectedList = receivedIntent.getStringExtra("name");
//set text to show the current selected name
textView_listName.setText(selectedList);
// ArrayAdapter aa = new ArrayAdapter(..., itemsList);
// ArrayAdapter itemListAdapter = new ArrayAdapter();
ListView_ListDetail.setAdapter(new ListItemAdapter(this, R.layout.activity_item_detail_list, listDetailData));
getListDetail();
btn_editListName = findViewById(R.id.btn_addNewItem);
btn_editListName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addItem();
editText_addNewItemName.getText().clear();
}
});
}
public void addItem(){
String newItemName = editText_addNewItemName.getText().toString().trim();
if(TextUtils.isEmpty(newItemName)){
Toast.makeText(this, "Please enter a new item", Toast.LENGTH_SHORT).show();
// ****Must have return to make it work****
return;
}
if(db.addListsItem(newItemName,selectedID)){
Toast.makeText(this, "New item added to the list", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this, "Error, no item add to the list", Toast.LENGTH_SHORT).show();
}
getListDetail();
}
public void getListDetail(){
listDetailData.clear();
Cursor cursor = db.getListDetail(selectedID);
//Log.d("TAG", "selected ID" +selectedID);
//ArrayList<String> listDetailData = new ArrayList<>();
while(cursor.moveToNext()){
listDetailData.add(cursor.getString(0));
}
//ListAdapter listDetailAdapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, listDetailData);
//ListView_ListDetail.setAdapter(listDetailAdapter);
((ArrayAdapter<String>)ListView_ListDetail.getAdapter()).notifyDataSetChanged();
}
}
package com.puyakul.prin.psycholic_购物;
导入android.content.Context;
导入android.content.Intent;
导入android.database.Cursor;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.text.TextUtils;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ImageView;
导入android.widget.ListAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.sql.Time;
导入java.util.ArrayList;
导入java.util.List;
公共类MainListDetail扩展了AppCompatActivity{
专用按钮btn_deleteItem,btn_editListName;
私有EditText EditText_ListName、EditText_addNewItemName;
私有文本视图文本视图_列表名;
私有ListView ListView\u ListDetail;
专用数据库;
私有字符串selectedList;
私有int-selectedID;
public ArrayList listDetailData=new ArrayList();
//时间戳代码,与当前时区匹配
//今天的私人时间=新时间(Time.getCurrentTimezone());
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u main\u List\u detail);
//声明布局元素
ListView\u ListDetail=findViewById(R.id.ListView\u ListDetail);
textView_listName=findviewbyd(R.id.textVie_listName);
editText\u addNewItemName=findViewById(R.id.editText\u addNewItemName);
//声明数据库
db=新的DatabaseHelper(此);
//从MainListView获取额外的意图
Intent receivedIntent=getIntent();
//现在获取我们额外传递的列表ID
选择edid=receivedIntent.getIntExtra(“id”,0);/-1作为默认值
//现在获取我们额外传递的名称
selectedList=receivedIntent.getStringExtra(“名称”);
//设置文本以显示当前选定的名称
textView_listName.setText(selectedList);
//ArrayAdapter aa=新的ArrayAdapter(…,itemsList);
//ArrayAdapter itemListAdapter=新的ArrayAdapter();
ListView_ListDetail.setAdapter(新的ListItemAdapter(this,R.layout.activity_item_detail_list,listDetailData));
getListDetail();
btn_editListName=findViewById(R.id.btn_addNewItem);
btn_editListName.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
addItem();
editText_addNewItemName.getText().clear();
}
});
}
公共无效附加项(){
字符串newItemName=editText\u addNewItemName.getText().toString().trim();
if(TextUtils.isEmpty(newItemName)){
Toast.makeText(这是“请输入新项目”,Toast.LENGTH_SHORT.show();
//****必须返回才能正常工作****
返回;
}
if(db.addListsItem(newItemName,selectedID)){
Toast.makeText(这是“添加到列表中的新项目”,Toast.LENGTH_SHORT.show();
}
否则{
Toast.makeText(这是“错误,没有项目添加到列表”,Toast.LENGTH_SHORT.show();
}
getListDetail();
}
public void getListDetail(){
listDetailData.clear();
Cursor=db.getListDetail(selectedID);
//Log.d(“标签”、“选定ID”+选定ID);
//ArrayList listDetailData=新建ArrayList();
while(cursor.moveToNext()){
listDetailData.add(cursor.getString(0));
}
//ListAdapter listDetailAdapter=new ArrayAdapter(这是android.R.layout.simple\u expandable\u list\u item\u 1,listDetailData);
//ListView_ListDetail.setAdapter(listDetailAdapter);
((ArrayAdapter)ListView_ListDetail.getAdapter()).notifyDataSetChanged();
}
}
ListAdapter类
package com.puyakul.prin.psychic_shopping;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class ListItemAdapter extends ArrayAdapter<String> {
private static final String TAG = "ListItemAdapter";
public ListItemAdapter(@NonNull Context context, int resource, @NonNull ArrayList<String> objects) {
super(context, resource, objects);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
if (convertView == null){
// LayoutInflater inflater = LayoutInflater.from(getContext());
// convertView = inflater.inflate(layout, parent, false);
convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_item_detail_list, parent, false);
}
ViewHolder viewHolder = new ViewHolder();
viewHolder.listItem_Thumbnail = convertView.findViewById(R.id.img_thumbnail);
viewHolder.listItem_Name = convertView.findViewById(R.id.textView_listItemText);
viewHolder.listItem_Remove_btn = convertView.findViewById(R.id.btn_listItemRemove);
viewHolder.listItem_Name.setText(getItem(position));
convertView.setTag(viewHolder);
return convertView;
}
public class ViewHolder {
ImageView listItem_Thumbnail;
TextView listItem_Name;
Button listItem_Remove_btn;
}
}
package com.puyakul.prin.psycholic_购物;
导入android.content.Context;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.ImageView;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.List;
公共类ListItemAdapter扩展了ArrayAdapter{
私有静态最终字符串标记=“ListItemAdapter”;
公共ListItemAdapter(@NonNull上下文上下文,int资源,@NonNull ArrayList对象){
超级(上下文、资源、对象);
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
if(convertView==null){
//LayoutInflater充气器=LayoutInflater.from(getContext());
//convertView=充气机。充气(布局,父级,假);
convertView=LayoutInflater.from(getContext()).flate(R.layout.activity\u item\u detail\u list,parent,false);
}
ViewHolder ViewHolder=新ViewHolder();
viewHolder.listItem_缩略图=convertView.findViewById(R.id.img_缩略图);
viewHolder.listItem\u Name=convertView.findViewById(R.id.textView\u listItemText);
viewHolder.listItem\u Remove\u btn=convertView.findViewById(R.id.btn\u listItemRemove);
viewHolder.listItem_Name.setText(getItem(position));
convertView.se
class ListItemAdapter extends ArrayAdapter<String>
class ListItemAdapter extends ArrayAdapter<MyClass>