Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android studio listview更改项_Java_Android_Sqlite - Fatal编程技术网

Java Android studio listview更改项

Java Android studio listview更改项,java,android,sqlite,Java,Android,Sqlite,有人能帮我更改listview中项目的名称吗?我不知道怎么做。我正在使用SQLite数据库,这是我的更新名称: public void doneName(String finishedName,int id, String oldName) { SQLiteDatabase db = this.getWritableDatabase(); String query = "UPDATE " + TABLE_NAME + " SET " + COL2 + "

有人能帮我更改listview中项目的名称吗?我不知道怎么做。我正在使用SQLite数据库,这是我的更新名称:

public void doneName(String finishedName,int id, String oldName)
    {

        SQLiteDatabase db = this.getWritableDatabase();
        String query = "UPDATE " + TABLE_NAME + " SET " + COL2 + " = '" + finishedName + "' WHERE " + COL1 +
                " = '" + id + "'" + " AND " + COL2 + " = '" + oldName + "'";
        db.execSQL(query );
    }
在此之后,在我的活动中,我将McClickListener设置为应该更改名称的位置,但不更改名称,它只显示toast:

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String name = parent.getItemAtPosition(position).toString();
                Cursor cursor =th.getItemID(name);
                int itemID = -1;
                while(cursor.moveToNext())
                {
                    itemID = cursor.getInt(0);
                }
                if(itemID>-1) {
                    String item = "Done";
                    th.doneName(item, selectedID, selectedName);
                    Toast.makeText(HomePageActivity.this, "You have accomplished this task!", Toast.LENGTH_SHORT).show();
                }}
        });

@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
字符串名称=parent.getItemAtPosition(position).toString();
Cursor Cursor=th.getItemID(名称);
int itemID=-1;
while(cursor.moveToNext())
{
itemID=cursor.getInt(0);
}
如果(项目ID>-1){
String item=“完成”;
th.doneName(项目,selectedID,selectedName);
Toast.makeText(HomePageActivity.this,“您已经完成了此任务!”,Toast.LENGTH\u SHORT.show();
}}
});

恐怕您没有更新相关适配器项的实例。 如果此ListView适配器附带了字符串列表,则应使用要显示的名称在相关位置初始化字符串项。然后调用Adapter.notifyDataSetChanged以使用更新的列表刷新ListView中的所有UI元素

看起来,您从未更新适配器列表中的字符串实例是双重的

  • 首先,您没有从数据库中提取更新的数据(您可以假设基础数据已经更新了,这是有风险的)
  • 您没有使用更改刷新Listview,因此它会显示它所知道的数据
  • 我建议使用游标适配器,它可以简化问题,因为游标适配器设计用于游标,特别是当游标通常位于适当的行时(例如,当使用onItemClick和onItemLongClick时),它们可以使所有数据通过adpater随时可用

    下面是一个基于您的代码的示例,该代码在单击列表中的项目时使用SimpleCorsorAdapter更改数据库和列表视图(要演示单击同一行而不是将测试更改为完成,它会反转文本,以便每次单击都会翻转)

    但是,要使用游标适配器,必须有一个名为\u id的列,该列应该是唯一的整数(实际上应该是long而不是int),并且通常是rowid的别名(即使用_idinteger主键定义(带或不带自动递增,最好不带自动递增))。因此,存在一个常量BaseColumns.\u ID,其中包含值\u ID

    首先是DatabaseHelper(SQLiteOpenHelper的子类),在本例中是DatabaseHelper.java:-

    public class DatabaseHelper extends SQLiteOpenHelper {
    
        public static final String DBNAME = "mydb";
        public static final  int DBVERSION = 1;
    
        public static final String TABLE_NAME = "mytable";
        /*<<<<<<<<<< id column must be _id (BaseColumns._ID) for Cursor Adapters >>>>>>>>>*/
        public static final String COLID = BaseColumns._ID;
        public static final String COL1 = "mycol1";
        public static final String COL2 = "mycol2";
    
        public DatabaseHelper(@Nullable Context context) {
            super(context, DBNAME, null, DBVERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
                    COLID + " INTEGER PRIMARY KEY, " +
                    COL1 + " TEXT, " +
                    COL2 + " TEXT " +
                    ")"
            );
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public long insert(String col1, String col2) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(COL1,col1);
            cv.put(COL2,col2);
            return db.insert(TABLE_NAME,null,cv);
        }
    
        public int doneName(String finishedName,int id, String oldName) {
    
            /*
                Alternative using the update convenience method
                Based upon :-
                String query = "UPDATE " + TABLE_NAME + " SET " + COL2 + " = '" + finishedName + "' WHERE " + COL1 +
                    " = '" + id + "'" + " AND " + COL2 + " = '" + oldName + "'";
    
                    writes the SQL for you.
                    protects against SQL Injection
                    returns the number of rows updated
             */
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(COL2,finishedName);
            return db.update(TABLE_NAME,cv,COLID + "=? AND " + COL2 + "=?",new String[]{String.valueOf(id),oldName});
        }
    
        public Cursor getAll() {
            SQLiteDatabase db = this.getWritableDatabase();
            return db.query(TABLE_NAME,null,null,null,null,null,null);
        }
    }
    
    public类DatabaseHelper扩展了SQLiteOpenHelper{
    公共静态最终字符串DBNAME=“mydb”;
    公共静态最终int DBVERSION=1;
    公共静态最终字符串表\u NAME=“mytable”;
    /**/
    公共静态最终字符串COLID=BaseColumns.\u ID;
    公共静态最终字符串COL1=“mycl1”;
    公共静态最终字符串COL2=“mycl2”;
    公共DatabaseHelper(@Nullable上下文){
    super(上下文,DBNAME,null,DBVERSION);
    }
    @凌驾
    public void onCreate(SQLiteDatabase db){
    db.execSQL(“如果不存在则创建表”+表名称+”(“+
    COLID+“整数主键,”+
    COL1+“文本,”+
    COL2+“文本”+
    ")"
    );
    }
    @凌驾
    public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
    }
    公共长插入(字符串col1、字符串col2){
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues cv=新的ContentValues();
    cv.put(COL1,COL1);
    cv.put(COL2,COL2);
    返回db.insert(表名称,null,cv);
    }
    public int doneName(字符串finishedName、int id、字符串oldName){
    /*
    使用更新便利方法的替代方案
    基于:-
    String query=“UPDATE”+表名+“SET”+COL2+“='”+finishedName+“'其中”+COL1+
    “='”+id+“+”和“+COL2+”='“+oldName+””;
    为您编写SQL。
    防止SQL注入
    返回更新的行数
    */
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues cv=新的ContentValues();
    cv.put(COL2,完成名称);
    返回db.update(TABLE_NAME,cv,COLID+“=”和“+COL2+”=?”,新字符串[]{String.valueOf(id),oldName});
    }
    公共游标getAll(){
    SQLiteDatabase db=this.getWritableDatabase();
    返回db.query(表名称,null,null,null,null,null,null);
    }
    }
    
    • 三个自定义方法insert(插入一行)、getAll(返回包含所有行的游标)和您的doneName方法(重写以利用更新便利方法)

    • 您可能会注意到,没有任何方法将提取的数据转换为对象的列表/数组列表/数组。这是因为在使用游标适配器时不需要

    活动MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        ListView mListView;
        DatabaseHelper th;
        Cursor csr;
        SimpleCursorAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mListView = this.findViewById(R.id.listview);
            th = new DatabaseHelper(this);
            addSomeTestData();
            manageAdapter();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            csr.close(); //<<<<<<<<<< Should always close Cursors when done with them
        }
    
        private void manageAdapter() {
            /* This handles but the initialisation and the refreshing of the Listview */
            /* First time it is called it initialises the Adapter and Listview */
            /* On subsequent calls it refreshes the ListView */
            csr = th.getAll();
            if (adapter == null) {
                adapter = new SimpleCursorAdapter(
                        this,
                        android.R.layout.simple_expandable_list_item_2,csr,
                        new String[]{
                                DatabaseHelper.COL1,
                                DatabaseHelper.COL2
                        },
                        new int[]{
                                android.R.id.text1,
                                android.R.id.text2},
                        0
                );
                mListView.setAdapter(adapter);
                mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        if (th.doneName(
                                /* reverses string to test multiple updates of the same row */
                                new StringBuilder(csr.getString(csr.getColumnIndex(DatabaseHelper.COL2))).reverse().toString()
                                /* "Done" */,
                                (int )id /* NOTE ID IS PASSED to onItemClick FOR CURSOR ADAPTER */,
                                csr.getString(csr.getColumnIndex(DatabaseHelper.COL2)) /* NOTE Oldname isn't required as ID will identify the row */
                        ) > 0) {
                            manageAdapter(); //<<<<<<<<< after updating refresh the Cursor and the ListView
                            Toast.makeText(view.getContext(),"Updated OK.",Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(view.getContext(),"Not Updated!!!",Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            } else {
                adapter.swapCursor(csr);
            }
        }
    
        private void addSomeTestData() {
            //Add some data but only if none exists
            if (DatabaseUtils.queryNumEntries(th.getWritableDatabase(),DatabaseHelper.TABLE_NAME) > 0) return;
            th.insert("TEST1 COL1","TEST1 COL2");
            th.insert("TEST2 COL1","TEST2 COL2");
            th.insert("TEST3 COL1","TEST3 COL2");
            th.insert("TEST4 COL1","TEST4 COL2");
            th.insert("TEST5 COL1","TEST5 COL2");
        }
    }
    
    public类MainActivity扩展了AppCompatActivity{
    列表视图;
    数据库;
    光标csr;
    SimpleCursorAdapter适配器;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mListView=this.findviewbyd(R.id.listview);
    th=新数据库助手(此);
    addSomeTestData();
    manageAdapter();
    }
    @凌驾
    受保护的