在 Edit_WorkDetails 中,它有一个 listView
用于填充从 SQLite
检索的数据。
ListView listViewUpdate;
CustomBaseAdapter obj;
private SimpleCursorAdapter dataAdapter;
Long ID, iD;
ArrayList<DetailsBean> results = new ArrayList<DetailsBean>();
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View edit_details = inflater.inflate(R.layout.edit_work_details, container, false);
dbHelper = new MyDatabaseHelper(getActivity());
sqlcon = new WorkDetailsAPI(getContext());
listViewUpdate = (ListView) edit_details.findViewById(R.id.listViewEdit);
obj = new CustomBaseAdapter(getActivity(), results, listViewUpdate);
listViewUpdate.setAdapter(obj);
Bundle bundle = this.getArguments();
if (getArguments() != null) {
ID = bundle.getLong("ID"); // receive ID from other activity, Assume is ID=1
BuildEditDetails(ID);
}
public void BuildEditDetails(long ID) {
final long id = ID;
Toast.makeText(getActivity(), id + "", Toast.LENGTH_LONG).show();
sqlcon.open();
Cursor cursor = sqlcon.readData(id);
String[] columns = new String[]{MyDatabaseHelper.Project, MyDatabaseHelper.WorkDescription};
int[] to = new int[]
{
R.id.Project, R.id.Description };
dataAdapter = new SimpleCursorAdapter(getActivity(), R.layout.retrieve_details, cursor, columns, to, 0);
listViewUpdate.setAdapter(dataAdapter);
}
点击列表后,会进入Edit_Details进行编辑。
listViewUpdate.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> listView, View view,
int position, long id) {
mClickedPosition = position;
Cursor cursor = (Cursor) listView.getItemAtPosition(position);
iD = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
Toast.makeText(getActivity(), iD + "", Toast.LENGTH_LONG).show();
Intent intent = new Intent(getActivity(), Edit_Details.class);
intent.putExtra("ID", iD);
startActivityForResult(intent, PROJECT_REQUEST_CODE);
}
});
iD
表示listView中的id,显示值2
。
Edit_Details
所有属于 iD (2) 的数据将显示在 Edit_Details 中。单击保存 按钮
时,更新的值将保存到 SQLite
并返回到 Edit_WorkDetails listView
。
save.setOnClickListener(new View.OnClickListener() { // if save button clicked
@Override
public void onClick(View v) {
Intent returnIntent = new Intent();
project1=Project2.getSelectedItem().toString();
description=Description.getText().toString();
sqlcon.open();
sqlcon.Update(ID, project1, description); // update the latest value in SQLite
returnIntent.putExtra("project1", project1);
returnIntent.putExtra("description", description);
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
});
这是 Edit_WorkDetails 的 OnActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { // receive from Activity B and populate ListView A
if (resultCode == Activity.RESULT_OK) {
if (requestCode == PROJECT_REQUEST_CODE) {
ReceiveProject = data.getStringExtra("Project");
ReceiveDescription = data.getStringExtra("Description");
if (mClickedPosition == -1) { // if icon clicked
if (obj != null) {
Toast.makeText(getActivity(), "S", Toast.LENGTH_LONG).show();
}
} else {
if (obj != null) // obj is CustomBaseAdapter object
obj.changeItem(mClickedPosition, ReceiveProject, ReceiveDescription);
}
}
}
}
自定义基础适配器
public class CustomBaseAdapter extends BaseAdapter{ // for ListView
private static ArrayList<DetailsBean> searchArrayList;
private LayoutInflater mInflater;
ListView listview;
public CustomBaseAdapter(Context context, ArrayList<DetailsBean> results,ListView listview) {
searchArrayList = results;
this.listview=listview;
mInflater = LayoutInflater.from(context);
}
public void changeItem(int m,String P,String D)
{
DetailsBean obj = new DetailsBean();
obj.setProject(" "+P);
obj.setDescription(" "+" Work Description : " + " "+D);
searchArrayList.set(m,obj);
this. notifyDataSetChanged();
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
细节 bean
private String project="";
private String description="";
public class DetailsBean {
public void setProject(String project){
this.project=project;
}
public String getProject()
{
return project;
}
public void setDescription(String description){
this.description=description;
}
public String getDescription()
{
return description;
}
}
单击 Edit_Details 中的保存按钮时,应用程序崩溃。
LogCat 错误
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.set(ArrayList.java:481)
at com.example.project.myapplication.Adapter.CustomBaseAdapter.changeItem(CustomBaseAdapter.java:47)
at com.example.project.myapplication.GUI.Edit_WorkDetails.onActivityResult(Edit_WorkDetails.java:125)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)
有人可以帮助我吗?
这两个代码有错误
obj.changeItem(mClickedPosition, ReceiveProject, ReceiveDescription);
和
searchArrayList.set(m,obj);
最佳答案
我认为您的自定义适配器中的这个成员类不应该是静态的:
static ArrayList<DetailsBean> searchArrayList;
“静态”意味着它与类关联,而不是实例。当您在构造函数中设置它时,每个实例都是如此。
这也是个坏主意:
searchArrayList = results;
您应该复制一份以使引用保持私密:
this.searchArrayList = new ArrayList<DetailsBean>(results);
这是有问题的行:
searchArrayList.set(m,obj);
您传入 m=1
,但 List
已被初始化,因此它是空的。
ArrayList<DetailsBean> results = new ArrayList<DetailsBean>();
这是您在创建 CustomBaseAdapter
时传递给构造函数的列表。我看不出你在哪里改变它。这些结果来自 SQL 数据库吗?也许您的查询没有返回任何结果,但您认为它返回了结果。
什么是 DetailsBean
?这是两个通用名称的组合,无法提供有关此对象是什么的任何见解。我会重新考虑的。看起来您想要在该对象中包含项目名称和描述。为什么不称它为 Project
?就是这样。
那些私有(private)变量是否应该在您的 DetailsBean
中?如果没有,谁拥有它们?这看起来也不对。这甚至可以编译吗?
您的代码不遵循 Java 编码标准。您的命名不一致且令人困惑。变量名应以小写字母开头;类以大写字母开头。
关于android - 无法解决java.lang.IndexOutOfBoundsException : Invalid index 1, size is 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34451023/