gpt4 book ai didi

java - findViewById(int) 在空对象引用上

转载 作者:行者123 更新时间:2023-12-01 10:12:58 24 4
gpt4 key购买 nike

我遇到了另一个问题。

我有一个部分有效的脚本。当我的 ListView 中的条目约为 5-10 时,它就起作用了。但是,当我在 50-60 左右添加 50 个条目时,它会抛出 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null调用脚本时的对象引用。

这是 onCreate,其中删除按钮从 SQLite 数据库中删除 ListView 中选定的行。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);


//SQLite Database
final DatabaseHandler db = new DatabaseHandler(this);


//listview

final ListView questionList = (ListView) findViewById(R.id.questionList);
final Cursor cursor = db.getData();
final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, new String[] { DatabaseHandler.COL_QUESTION }, new int[] { R.id.checkedTextView1 },0);
assert questionList != null;
questionList.setAdapter(adapter);
questionList.setItemsCanFocus(false);
questionList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

//Erasebutton listener
final Button eraseButton = (Button) findViewById(R.id.eraseButton);
assert eraseButton != null;
eraseButton.setOnClickListener(new View.OnClickListener() { //erasebutton onclick
public void onClick(View eraseButton) {
SparseBooleanArray checked = questionList.getCheckedItemPositions();
for (int i = questionList.getCount() - 1; i >= 0; i--) {
if (checked.get(i)) {
//What to do with selected listitems
TextView tv = (TextView) questionList.getChildAt(i).findViewById(R.id.checkedTextView1);
db.removeData(tv.getText().toString());
}
}
checked.clear();
Cursor newCursor = db.getData();
adapter.swapCursor(newCursor);
}
});


//addbutton listener
final Button addButton = (Button) findViewById(R.id.addButton);
assert addButton != null;
addButton.setOnClickListener(new View.OnClickListener() { //Nextbutton onclick
public void onClick(View addButton) {
EditText addText = (EditText) findViewById(R.id.addText);
assert addText != null;
String text = addText.getText().toString();
if(!text.matches("") && text.startsWith("Jag har aldrig ")) {
addText.setText("");
db.insertData(text);
Cursor newCursor = db.getData();
adapter.swapCursor(newCursor);
} else {
Toast.makeText(Main3Activity.this, "Börja din fråga med \"Jag har aldrig\"", Toast.LENGTH_SHORT).show();
}
}

});


//Nextbutton listener
final Button returnButton = (Button) findViewById(R.id.returnButton);
assert returnButton != null;
returnButton.setOnClickListener(new View.OnClickListener() { //Nextbutton onclick
public void onClick(View returnButton) {
Intent mainMenu = new Intent(Main3Activity.this, Main2Activity.class);
Main3Activity.this.startActivity(mainMenu);
}
});


}

引发错误的行是 TextView tv = (TextView) QuestionList.getChildAt(i).findViewById(R.id.checkedTextView1);

有人知道为什么会发生这种情况吗?我仍然可以从列表中选择前 5-10 个项目并将其删除,但是一旦我选择 ListView 中的底部项目,应用程序就会因此错误而崩溃。

最佳答案

正如评论中提到的,您应该从 questionList 上设置的适配器获取文本,而不是使用 getChildAt(i)

尝试做这样的事情

 for (int i = questionList.getCount() - 1; i >= 0; i--) {
Cursor c = (Cursor) adapter.getItem(i);
if (checked.get(i)) {
// Get data from cursor
String text = c.getString(c.getColumnIndex(DatabaseHandler.COL_QUESTION));
db.removeData(text);
}
}

关于java - findViewById(int) 在空对象引用上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36046746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com