【问题标题】:Cannot solve java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0无法解决 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
【发布时间】:2016-03-30 19:03:45
【问题描述】:

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 上。当点击保存button时,更新的值将被保存到SQLite并返回到Edit_WorkDetailslistView

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);

                }
            }
        }
    }

CustomBaseAdapter

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;
    }

DetailsBean

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);

【问题讨论】:

  • “小时”?问题就在这里:com.example.project.myapplication.Adapter.CustomBaseAdapter.changeItem(CustomBaseAdapter.java:47)。通过调试器旋转将在半小时内解决这个问题,顶。那是你喝咖啡的时候。
  • 我试着在这里写一个好问题。任何帮助将不胜感激。 :)
  • 不要在适配器中使用静态,启用调试模式并检查每一行代码,以便您找到差距。 .

标签: android sqlite listview indexoutofboundsexception


【解决方案1】:

我认为您的自定义适配器中的这个成员类不应该是静态的:

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?就是这样。

这些私有变量是否应该在您的DetailsBean 中?如果没有,谁拥有它们?这看起来也是不对的。这还能编译吗?

您的代码不符合 Java 编码标准。您的命名不一致且令人困惑。变量名应以小写字母开头;类以大写字母开头。

【讨论】:

  • 感谢您的帮助。我应该删除静态吗?
  • 我想是的。您还应该使用调试器并查看您的假设与代码的真实行为不匹配的地方。
  • 我删除了private static并将searchArrayList = results;更改为this.searchArrayList = new ArrayList&lt;DetailsBean&gt;(results);,但仍然出现同样的错误
  • 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
  • 使用调试器。这是我编译和运行它所需的所有代码吗?没关系 - SQLite 和数据库意味着这对我来说工作量太大。了解如何使用 IDE 和调试器。
猜你喜欢
  • 2018-08-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多