【问题标题】:How do I update the listView如何更新列表视图
【发布时间】:2015-12-23 08:51:23
【问题描述】:

WorkDetails 中有一个listView。单击列表时,它将意图EditDetails。当点击EditDetails中的保存按钮时,会将更新后的值返回给WorkDetails

编辑详情

 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);
                returnIntent.putExtra("project1", project1);
                returnIntent.putExtra("description", description);
                setResult(Activity.RESULT_OK, returnIntent);
                finish();

            }
        });

工作详情

     ListView listViewUpdate;
     CustomBaseAdapter obj;
     ArrayList<DetailsBean> results = new ArrayList<DetailsBean>();

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {    
     listViewUpdate = (ListView) edit_details.findViewById(R.id.listViewEdit);
     obj = new CustomBaseAdapter(getActivity(), results, listViewUpdate);
     listViewUpdate.setAdapter(obj);


           listViewUpdate.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> listView, View view,
                                                int position, long id) {
                            mClickedPosition = position; // intent to EditDetils
                            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);


                        }
                    });

         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) {
                    Toast.makeText(getActivity(), "A", Toast.LENGTH_LONG).show();
                } else {
                    Log.e("R",results+"");
                    Log.e("P",mClickedPosition+"");
                    results.get(mClickedPosition).setProject(ReceiveProject);
                    results.get(mClickedPosition).setDescription(ReceiveDescription);
                    obj.notifyDataSetChanged();
                }

            }

        }
    }

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 int getCount() {
            return searchArrayList.size();
        }


        public Object getItem(int position) {
            return searchArrayList.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

DetailsBean

public class DetailsBean {

        private String project="";
        private String description="";

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

    }

如何刷新 WorkDetails listView 以便它能够显示 从 EditDetails 返回的更新值?当我单击 WorkDetails 中的列表时,它会显示更新的值。

WorkDetails 扩展到 Fragment,EditDetails 扩展到 Activity。

LogCat 错误

Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
            at java.util.ArrayList.get(ArrayList.java:308)
            at com.example.project.myapplication.GUI.Edit_WorkDetails.onActivityResult(Edit_WorkDetails.java:123)

【问题讨论】:

  • 您的ListView 是如何填充的?你用什么Adapter?通常,将新数据添加到 Adapter 的支持数组并调用 adapter.notifyDataSetChanged() 就足够了
  • WorkDetails 的listView 的适配器上调用notifyDataSetChanged(),您应该一切顺利。
  • 我必须在WorkDetailsCustomBaseAdapter 上致电notifyDataSetChanged()
  • @Knossos 请检查
  • @John 只需调用 obj.notifyDataSetChanged(),因为您调用了 Adapter obj

标签: android listview android-listview startactivityforresult


【解决方案1】:
  • 如果您确定EditDetails 何时更新adapter 中的数据,请在onActivityResult 中使用adapter.notifyDataSetChanged()

【讨论】:

  • 我在ReceiveDescription = data.getStringExtra("description");之后添加了这个dataAdapter.notifyDataSetChanged();,但没有区别
  • 您有Adapter的更新数据吗?请发布适配器代码
  • 您在 changeItem 中添加了新的 DetailsBean ?它没有改变
  • 您想更改列表视图中的项目吗?或添加新的?您可以 Log.e() 进入: if (obj != null) { obj.changeItem(ReceiveProject, ReceiveDescription, ReceiveProgress, ReceiveTimeIn, ReceiveTimeOut); Log.e("更新列表视图","是更新"); } 查看日志。
  • 我现在该怎么办,我要改变
【解决方案2】:

更改 onItemClick。

  listViewUpdate.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> listView, View view,
    int position, long id) {
        mClickedPosition = position; // intent to EditDetils
        DetailsBean detailsBean=results.get(position);

        // Get the state's capital from this listview_item_row in the database.
        ID =detailsBean.getID;
        Intent intent = new Intent(getActivity(), Edit_Details.class);
        intent.putExtra("ID", ID);
        startActivityForResult(intent, PROJECT_REQUEST_CODE);


    }
});

【讨论】:

  • 在我的情况下是mClickedPosition
  • app crashed..IndexOutOfBoundsException: Invalid index 0, size is 0
  • 你有结果吗?为什么结果=空?使用 searchArrayList 的结果参考。你从哪里得到 searchArrayList ?
  • 是的,结果 [] ,mClickedPosition = 0
  • 查看结果 .size() =?
【解决方案3】:
     @Override
            protected void onRestart() {
                super.onRestart();
// call your adapter from here
                obj = new CustomBaseAdapter(getActivity(), results, listViewUpdate);
                listViewUpdate.setAdapter(obj);
            }

然后再次从 onRestart() 设置适配器并检查。

【讨论】:

【解决方案4】:

试试下面的代码 -

public void changeItem(String Project,String Description)
{
    DetailsBean obj = new DetailsBean();
     obj.setProject("   "+Project);
     obj.setDescription("  "+" Work Description : " + " "+Description);
     searchArrayList.add(obj);
     add(obj);
     notifyDataSetChanged();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多