Java ArrayAdapter SQLite和customListView

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.

我正在android studio中为我的作业构建一个基本购物清单应用程序。我对Java非常陌生,在从SQLite传递数据时,我对ArrayAdapter非常困惑。请看一下我的代码,我会尽力解释我面临的问题=(

DatabaseHelper类

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>