【发布时间】:2016-03-12 08:29:25
【问题描述】:
在 Edit_WorkDetails Activity 中,它有一个 ListView,其中的数据实际上是从 SQLite 检索到的。当列表被点击时,它会intent到Edit_Details进行编辑。
这就是我的 Edit_WorkDetails Activity 的样子。
当点击 Edit_Details 中的保存按钮时,应用程序崩溃了。
Edit_WorkDetails
listViewUpdate.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> listView, View view,
int position, long id) {
mClickedPosition=position; // update
// Get the cursor, positioned to the corresponding listview_item_row in the result set
Cursor cursor = (Cursor) listView.getItemAtPosition(position);
// Get the state's capital from this listview_item_row in the database.
ID =
cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
Intent intent = new Intent(getActivity(), Edit_Details.class);
intent.putExtra("ID", ID);
startActivityForResult(intent, PROJECT_REQUEST_CODE);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { // receive from Edit_Details and populate ListView
if (resultCode == Activity.RESULT_OK) {
if(requestCode==PROJECT_REQUEST_CODE) {
ReceiveProject = data.getStringExtra("project1");
ReceiveDescription = data.getStringExtra("description");
ReceiveProgress = data.getIntExtra("progress", 0);
ReceiveTimeIn = data.getStringExtra("timeIn");
ReceiveTimeOut = data.getStringExtra("timeOut");
if (mClickedPosition == -1) { // if icon clicked
if (objCustomBaseAdapter != null)
objCustomBaseAdapter.addNewItem(ReceiveProject, ReceiveDescription, ReceiveProgress, ReceiveTimeIn, ReceiveTimeOut);
} else { // update list
if (objCustomBaseAdapter != null)
objCustomBaseAdapter.changeItem(mClickedPosition, ReceiveProject, ReceiveDescription, ReceiveProgress, ReceiveTimeIn, ReceiveTimeOut);
}
}
}
}
Edit_Details.java
save.setOnClickListener(new View.OnClickListener() { // return values to Edit_WorkDetails and update the list
@Override
public void onClick(View v) {
Intent returnIntent = new Intent();
project1 = Project2.getSelectedItem().toString();
description = Description.getText().toString();
progress = seekBar.getProgress();
returnIntent.putExtra("project1", project1);
returnIntent.putExtra("description", description);
returnIntent.putExtra("progress", progress);
Toast.makeText(getApplicationContext(), progress + "", Toast.LENGTH_LONG).show();
returnIntent.putExtra("timeIn", timeIn);
returnIntent.putExtra("timeOut", timeOut);
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
});
}
CustomBaseAdapter
public void changeItem(int mPosition,String Project,String Description,int Percentage,String TimeIn,String TimeOut)
{
SearchResults obj = new SearchResults();
obj.setProject(Project);
obj.setDescription(" Work Description : " + Description);
obj.setProgress(" Progress : " + Percentage);
obj.setTimeIn(" Time In : " + TimeIn);
obj.setTimeOut(" Time Out : " + TimeOut);
searchArrayList.set(m,obj);
this. notifyDataSetChanged();
}
最后是 SearchResult.java
public class SearchResults {
private String weather = "";
private String date = "";
private String status = "";
private String timeIn="";
private String timeOut="";
private String project="";
private String description="";
private String progress="";
public void setWeather(String weather) {
this.weather = weather;
}
public String getWeather() {
return weather;
}
public void setDate(String date) {
this.date = date;
}
public String getDate() {
return date;
}
public void setStatus(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
public void setTimeIn(String timeIn) {
this.timeIn = timeIn;
}
public String getTimeIn() {
return timeIn;
}
public void setTimeOut(String timeOut){
this.timeOut=timeOut;
}
public String getTimeOut()
{
return timeOut;
}
public void setProject(String project){
this.project=project;
}
public String getProject()
{
return project;
}
public void setProgress(String progress){
this.progress=progress;
}
public String getProgress()
{
return progress;
}
public void setDescription(String description){
this.description=description;
}
public String getDescription()
{
return description;
}
}
错误日志猫
Process: com.example.project.myapplication, PID: 2467
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196609, result=-1, data=Intent { (has extras) }} to activity {com.example.project.myapplication/com.example.project.myapplication.GUI.ActivityB}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
(CustomBaseAdapter.java:101)
searchArrayList.set(m,obj);
(Edit_WorkDetails.java:141)
objCustomBaseAdapter.changeItem(mClickedPosition, ReceiveProject, ReceiveDescription, ReceiveProgress, ReceiveTimeIn, ReceiveTimeOut);
为什么我会收到这样的错误?无法将检索到的值从SQLite编辑为ListView?
数据库模型
db.execSQL("create table " + TABLE_WORKDETAILS + "( " + ID1 + " INTEGER PRIMARY KEY , Project TEXT, WorkDescription TEXT, Percentage Text, TimeIn DATETIME, TimeOut DATETIME, Twd_id INTEGER, FOREIGN KEY(Twd_id) REFERENCES "+TABLE_INFO+"(_id) )" );
注意到 Twd_id 是foreign key。
这是我的工作详情表
现在我在 Edit_WorkDetails
中检索了 workDetails 表数据Edit_WorkDetails
Bundle bundle = this.getArguments();
if(getArguments()!=null)
{
ID=bundle.getLong("ID"); // ID holds value 1
BuildEditDetails(ID);
}
public void BuildEditDetails(long ID)
{
final long id=ID;
sqlcon.open();
Cursor cursor=sqlcon.readData(id);
String[] columns=new String[]{MyDatabaseHelper.Project,MyDatabaseHelper.WorkDescription,MyDatabaseHelper.Percentage
,MyDatabaseHelper.TimeIn,MyDatabaseHelper.TimeOut};
int[] to=new int[]
{
R.id.Project,R.id.Description,R.id.Percentage,R.id.in,R.id.out
};
dataAdapter = new SimpleCursorAdapter(getActivity(), R.layout.retrieve_details, cursor, columns, to, 0);
listViewUpdate.setAdapter(dataAdapter);
}
下面的代码可以参考上面的代码
【问题讨论】:
-
您的 searchArrayList 为空,您不能将 set() 用于空索引,请改用 .add()。
-
@Nanoc 谢谢!!该应用程序现在没有崩溃,但值仍然保持不变,没有更新
-
应用在日志猫中有崩溃报告吗?
-
@lifeevader 如果我使用
add()而不是set(),我的应用程序没有崩溃,但值仍然保持不变,没有更新。然后我在obj.setProject(Project);之后在CustomBaseAdapter中添加一个log.e("Desc",Description),log给我更新的描述值,但是应用程序崩溃了 -
我刚刚再次阅读您的问题并注意到
indexoutofbound异常,这意味着您的数组中没有任何内容但您想访问它,向我们展示您的数据库模型,您正在创建表,添加数据并从中获取数据,这将为我们提供概览
标签: java android sqlite listview indexoutofboundsexception