【问题标题】:onItemClick loads empty activityonItemClick 加载空活动
【发布时间】:2018-01-11 23:17:22
【问题描述】:

我有 2 个活动,当我在第一个活动中输入内容并按“保存按钮”时,它会通过 SQLite 数据库保存文本。在第二个活动中,我有一个已保存项目的列表,当我单击其中一个时,onItemClick 方法需要触发并打开第三个活动,我可以在其中编辑或删除所选项目。 现在,当我单击一个项目时,一切正常。当我点击它时,第三个活动加载,但没有显示任何内容,几秒钟后它关闭并让我回到上一个活动。这是代码sn-ps:

第二个activity的代码sn-p,其中列表为:

  DatabaseHelper mDatabaseHelper;
private ListView mListView;
@Override
protected  void onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout);
    mListView=(ListView) findViewById(R.id.listView);
    mDatabaseHelper=new DatabaseHelper(this);
    populateListView();
}
private void populateListView() {
    Log.d(TAG,"populateListView: Displaying data in ListView.");
    Cursor data=mDatabaseHelper.getData();
    ArrayList<String> listData=new ArrayList<>();
    while (data.moveToNext()){
        listData.add(data.getString(1));
    }
    ListAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, listData);
    mListView.setAdapter(adapter);
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            //string name=the item saved
            String name = adapterView.getItemAtPosition(i).toString();
            Log.d(TAG,"onItemClick: You Clicked on "+ name);
            Cursor data=mDatabaseHelper.getItemID(name);
            int itemID= -1;
            while (data.moveToNext()){
                itemID = data.getInt(0);
            }
            if (itemID > -1){
                Log.d(TAG,"onItemClick: The ID is: "+itemID);
                Intent editScreenIntent = new Intent(MoneyTracking.this, EditDataActivity.class);
                editScreenIntent.putExtra("id",itemID);
                editScreenIntent.putExtra("name",name);
                startActivity(editScreenIntent);
            }
            else{
                toastMessage("No ID associated with that list item.");
            }
        }
    });
}
/**
 * Customizable toast
 * @param message
 */
private void toastMessage(String message){
    Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}}

然后是不会加载的“第三个活动”:

private Button btnSave2, btnDelete1;
private EditText editText00;
DatabaseHelper mDatabaseHelper;
private String selectedName;
private int selectedID;

@Override
protected void  onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.edit_data_layout);
    btnSave2=(Button)findViewById(R.id.btnSaveTwo);
    btnDelete1=(Button)findViewById(R.id.btnDelete);
    editText00=(EditText) findViewById(R.id.editText00);
    mDatabaseHelper=new DatabaseHelper(this);

    Intent recievedIntent=getIntent();
    selectedID=recievedIntent.getIntExtra("id",-1);
    selectedName=recievedIntent.getStringExtra("name");
    editText00.setText(selectedName);

    btnSave2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String item=editText00.getText().toString();
            if (!item.equals("")){
                mDatabaseHelper.updateName(item,selectedID,selectedName);
            }else{
                toastMessage("Morate uneti nesto da bi ste sacuvali!");
            }
        }
    });
    btnDelete1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mDatabaseHelper.deleteName(selectedID,selectedName);
            editText00.setText("");
            toastMessage("Izbrisano!");
        }
    });
}
/**
 * Customizable toast
 * @param message
 */
private void toastMessage(String message){
    Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}

}

数据库助手:

private  static final String TAG="DatabaseHelper";

private  static  final String TABLE_NAME="mt_lists";
private  static  final String COL1= "ID";
private  static  final String COL2= "listndprice";


public DatabaseHelper(Context context) {
    super(context, TABLE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable="CREATE TABLE "+ TABLE_NAME +" (ID INTEGER PRIMARY KEY AUTOINCREMENT, "+
            COL2+" TEXT)";
    db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
    onCreate(db);
}
public  boolean appData(String item)
{
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, item);

    Log.d(TAG, "appData: Adding "+item+" to "+TABLE_NAME);
    long result=db.insert(TABLE_NAME, null, contentValues);

    if (result == -1){
        return false;
    }
    else {
        return true;
    }
}

/**
 * Returns all the data from database
 * @return
 */
public Cursor getData(){
    SQLiteDatabase db = this.getWritableDatabase();
    String query="SELECT * FROM " + TABLE_NAME;
    Cursor data=db.rawQuery(query,null);
    return  data;
}

/**
 *
 * @param name
 * @return
 */
public Cursor getItemID(String name){
    SQLiteDatabase db = this.getWritableDatabase();
    String query="SELECT"+ COL1 +" FROM "+TABLE_NAME+" WHERE "+COL2+ " = '" + name + " ' ";
    Cursor data = db.rawQuery(query,null);
    return data;
}

/**
 * Update database
 * @param newName
 * @param id
 * @param oldName
 */
public void updateName(String newName,int id,String oldName){
    SQLiteDatabase db=this.getWritableDatabase();
    String query="UPDATE"+TABLE_NAME+"SET"+COL2+"='"+newName+"' WHERE"+COL1+"= '"+id+"'"+"AND"+COL2+"= '"+oldName+"'";
    Log.d(TAG,"updateName: query: "+query);
    Log.d(TAG,"updateName: Setting name to  "+newName);
    db.execSQL(query);
}
/**
 * Delete from database
 * @param id
 * @param name
 */
public void deleteName(int id,String name){
    SQLiteDatabase db=this.getWritableDatabase();
    String query="DELETE FROM" + TABLE_NAME + "WHERE" + COL1 + "= '" + id + "'" + " AND " + COL2 + "= '" +name +"'";
    Log.d(TAG,"deleteName: query: "+query);
    Log.d(TAG,"deleteName: Deleting "+name+"from database.");
    db.execSQL(query);
}

编辑 日志猫: enter image description here

【问题讨论】:

  • 你能发布 LogCat 吗?我想看看你的第三个活动关闭时是否有错误消息发布。
  • @Shn_Android_Dev 就是这样,我想:)
  • 这不是我想要的——虽然这确实是 logcat,但我想查看堆栈跟踪。它应该看起来像几行连续的红色文本......也有可能实际上没有错误。在此期间,我会继续尝试弄清楚发生了什么,但请验证在您打开第三个活动时是否没有产生错误。
  • @Shn_Android_Dev 图片已更新,这是您要找的吗?
  • 是的,请看我的回答,看看它是否适合你。

标签: java android android-activity


【解决方案1】:

好的,我想我找到了您的问题所在。您需要在 SQL 关键字和列名/值之间放置一个空格。在您的代码中,您的查询被写为“SELECTID FROM ...”。但它需要读取“SELECT ID FROM ...”。注意 SELECT 和 ID 之间的空格!:

    public Cursor getItemID(String name){
    SQLiteDatabase db = this.getWritableDatabase();
    String query="SELECT"+ COL1 +" FROM "+TABLE_NAME+" WHERE "+COL2+ " = '" + name + " ' ";
    Cursor data = db.rawQuery(query,null);
    return data;
}

把上面改成

public Cursor getItemID(String name){
    SQLiteDatabase db = this.getWritableDatabase();
    String query="SELECT "+ COL1 +" FROM "+TABLE_NAME+" WHERE "+COL2+ " = '" + name + " ' ";
    Cursor data = db.rawQuery(query,null);
    return data;
}

还要确保你的其他 SQL 方法没有同样的问题!

【讨论】:

  • 我改了,现在问题解决了!但是当我现在点击该项目时,它会显示以下错误,由我编写:“没有与该列表项关联的 ID。” ,这是写在我的第一个代码块中,在 populateListView 中。我无法理解现在的情况。我检查了SQL。堆栈跟踪说:“I/HwSecImmHelper:mSecurityInputMethodService 为空”
  • 您是否确认您的 SQLite 数据库中确实存在您选择的名称的项目?它有 ID 吗?
  • @drunken-sailor 另外,这可能与有关 mSecurityInputMethodService 为空的 logcat 消息有关吗? stackoverflow.com/questions/38587844/…
  • 我在我的huawei中更改了LOG设置,现在他可以获取元素的名称,但仍然无法打开第三个活动并显示相同的错误:No ID...我放新的 logcat 屏幕截图,请在上面查看。我现在真的很困惑...顺便说一句,您所说的验证 SQL 数据库中有一个项目是什么意思?我怎样才能做到这一点?我写的代码看起来不错,我就是不明白这是什么问题..
  • 我不知道我对代码做了什么,我只是浏览了每一行并更改了其中一些,现在应用程序运行正常!!!非常感谢@Shn_Android_Dev,你帮了大忙!
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
相关资源
最近更新 更多