Java 如何在完成上一个活动后刷新活动中的listview?

Java 如何在完成上一个活动后刷新活动中的listview?,java,android,listview,Java,Android,Listview,我的活动之间的互动: 单击listview.java中listview中的一行> 转到Edit.java编辑有关该特定行的信息> 编辑完成后,单击按钮,将完成edit.java活动> 返回listview.java 但是,从edit.java返回listview.java时,它不会显示以前单击的listview特定行的新更新信息 只有当我离开listview活动并再次返回时,信息才会更新 listview.java: MyItems mi; private ArrayList&l

我的活动之间的互动:

  • 单击listview.java中listview中的一行>

  • 转到Edit.java编辑有关该特定行的信息>

  • 编辑完成后,单击按钮,将完成edit.java活动>

  • 返回listview.java

  • 但是,从edit.java返回listview.java时,它不会显示以前单击的listview特定行的新更新信息

    只有当我离开listview活动并再次返回时,信息才会更新

    listview.java:

        MyItems mi;
        private ArrayList<SalesItemInformationLV> displayiteminfo;
    
         @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_list_sale_item);
        mi = MyItems.getInstance();
                displayiteminfo = mi.retrieveAllForlist(getApplicationContext());
    
                final ArrayAdapter<SalesItemInformationLV> adapter = new itemArrayAdapter(this, 0, displayiteminfo);
    
    
                final ListView listView = (ListView)findViewById(R.id.customListview);
                listView.setAdapter(adapter);
    
       // adapter.notifyDataSetChanged(); Place this code here but it does not work
    
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    SalesItemInformationLV saleitem2 = displayiteminfo2.get(info.position);
    
            String namevalue = saleitem2.getItemname();
            Double costpvalue = saleitem2.getCostprice();
            Double sellpvalue = saleitem2.getSellingprice();
            int qtyvalue = saleitem2.getItemquantity();
            String datevalue = saleitem2.getDatesold();
            int staffvalue = saleitem2.getStaffdiscount();
    
            Intent myintent = new Intent(List.this, Edit.class);
            myintent.putExtra("array", saleitem2);
            myintent.putExtra("itemname", namevalue);
            myintent.putExtra("itemcp", costpvalue);
            myintent.putExtra("itemsp", sellpvalue);
            myintent.putExtra("itemqty", qtyvalue);
            myintent.putExtra("itemds", datevalue);
            myintent.putExtra("itemsstaffdis", staffvalue);
    
            startActivity(myintent);
    
    }
    
    // Step 1 (Send data to edit.class)
    Intent i = new Intent(this, Edit.class);
    startActivityForResult(i, 1);
    
    // Step 3 (Receive new data)
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if(resultCode == RESULT_OK) {
                String strEditText = data.getStringExtra("key");
    
               // update your listview in here with new data
            }     
        }
    } 
    
    mymi;
    私有ArrayList displayiteminfo;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity\u list\u sale\u item);
    mi=MyItems.getInstance();
    displayiteminfo=mi.retrieveAllForlist(getApplicationContext());
    最终ArrayAdapter=new itemArrayAdapter(this,0,displayiteminfo);
    最终ListView ListView=(ListView)findViewById(R.id.customListview);
    setAdapter(适配器);
    //adapter.notifyDataSetChanged();将此代码放在此处,但它不起作用
    setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    public void onItemClick(AdapterView父对象、视图、整型位置、长id){
    SalesItemInformationLV saleitem2=displayiteminfo2.get(info.position);
    字符串namevalue=saleitem2.getItemname();
    Double costpvalue=saleitem2.getCostprice();
    Double sellpvalue=saleitem2.getSellingprice();
    int qtyvalue=saleitem2.getItemquantity();
    字符串datevalue=saleitem2.getDateSell();
    int staffvalue=saleitem2.getStaffdiscount();
    Intent myintent=newintent(List.this,Edit.class);
    myintent.putExtra(“数组”,saleitem2);
    myintent.putExtra(“itemname”,namevalue);
    myintent.putExtra(“itemcp”,成本值);
    myintent.putExtra(“itemsp”,sellpvalue);
    myintent.putExtra(“项目数量”,数量值);
    myintent.putExtra(“itemds”,日期值);
    myintent.putExtra(“itemsstaffdis”,staffvalue);
    星触觉(myintent);
    }
    
    这取决于项目的存储位置(数据库?)以及编辑活动是否将更改保存到数据库。如果是这样,您应该

    • 在listview活动中使用
      startActivityForResult()
      启动编辑活动
    • 在编辑活动中,用户完成后,使用
      setResult()
      finish()
      返回listview活动
    • 在listview活动中使用onActivityResult()检查您是否从编辑活动返回,如果是,则从数据库重新加载数据并使用listview的
      notifyDataSetChanged()

    这只是一个基本的工作流,可以进行各种优化。

    下面的代码演示了listview的基本实现

    在活动onCreate方法中:

        ListView listView = (ListView) findViewById(R.id.list);
    
        // Defined Array values to show in ListView
        String[] values = new String[] { "Android List View",
                "Adapter",
                "Simple List View ",
                "Create List View ",
                "Android Example",
                "List View ",
                "Array Adapter",
                "Android List View"
        };
    
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, values);
    
        listView.setAdapter(adapter);
    

    然后,您将看到listview已更新。实际上,适配器获取数组,然后将该数据发送到listview。listview不直接处理字符串数组。每次您对数组执行某种CRUD操作时,都会调用adapter.notifyDataSetChanged();以使listview反映您所做的更改。在应用过程中,我通常将数组替换为Arraylist,因为这使添加和删除更加容易。

    存在许多问题。首先,您发送的是该对象的属性,而不是对象本身。最快的方法(可能不是最好的方法)是发送对象(SalesItemInformationLV saleitem2)。为此,该对象需要实现可序列化接口

    这是传递可序列化对象的方法:

    使用此解决方案非常重要:

    然后,在onActivityResult()中,应该调用adapter.notifyDataSetChanged()


    请记住将适配器声明为全局属性(在方法之外)。

    您可以在onResume方法活动中使用
    适配器.notifyDataSetChanged();
    ,但最好使用
    startActivityForResult
    setResult
    方法。

    步骤1、2和3中的数据流

    listview.java:

        MyItems mi;
        private ArrayList<SalesItemInformationLV> displayiteminfo;
    
         @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_list_sale_item);
        mi = MyItems.getInstance();
                displayiteminfo = mi.retrieveAllForlist(getApplicationContext());
    
                final ArrayAdapter<SalesItemInformationLV> adapter = new itemArrayAdapter(this, 0, displayiteminfo);
    
    
                final ListView listView = (ListView)findViewById(R.id.customListview);
                listView.setAdapter(adapter);
    
       // adapter.notifyDataSetChanged(); Place this code here but it does not work
    
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    SalesItemInformationLV saleitem2 = displayiteminfo2.get(info.position);
    
            String namevalue = saleitem2.getItemname();
            Double costpvalue = saleitem2.getCostprice();
            Double sellpvalue = saleitem2.getSellingprice();
            int qtyvalue = saleitem2.getItemquantity();
            String datevalue = saleitem2.getDatesold();
            int staffvalue = saleitem2.getStaffdiscount();
    
            Intent myintent = new Intent(List.this, Edit.class);
            myintent.putExtra("array", saleitem2);
            myintent.putExtra("itemname", namevalue);
            myintent.putExtra("itemcp", costpvalue);
            myintent.putExtra("itemsp", sellpvalue);
            myintent.putExtra("itemqty", qtyvalue);
            myintent.putExtra("itemds", datevalue);
            myintent.putExtra("itemsstaffdis", staffvalue);
    
            startActivity(myintent);
    
    }
    
    // Step 1 (Send data to edit.class)
    Intent i = new Intent(this, Edit.class);
    startActivityForResult(i, 1);
    
    // Step 3 (Receive new data)
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if(resultCode == RESULT_OK) {
                String strEditText = data.getStringExtra("key");
    
               // update your listview in here with new data
            }     
        }
    } 
    
    Edit.java:

    // Step 2 (Edit data in here, and send to listview.java with setResult)
    Intent intent = new Intent();
    intent.putExtra("key", "value")    
    setResult(RESULT_OK, intent);        
    finish();
    

    请向我们展示listview.java和edit.java之间的交互。@LeandroCampo嗨,我已经编辑过了,请看一看谢谢!太好了!!但我需要代码=)。请展示用于交互的代码。@sarah你试过使用adapter.notifyDataSetChanged()吗;编辑该行的一部分对象后?@LeandroOcampo您好!我再次编辑了它!在第一个灰色框中,我已注释掉适配器的放置位置。notifyDataSetChanged()代码。请看一看。谢谢!CRUD操作是在另一个活动中完成的。我如何将适配器传递给另一个活动?@sarah对于Android中的SQLite数据库,您应该使用CursorAdapter显示它们。您没有传递适配器,而是传递光标或数据库对象。嘿,sarah,您尝试过其他完成方法吗活动并按照@cricket_007的建议通过光标传递更改后的数据。我写下了我的答案,以便您了解notifyDataSetChanged是如何工作的。请看Ridcully的答案,以了解如何实际将数据从一个活动传递到另一个活动。您好,我已将saleitem2声明为可序列化的。onActivityResult()是在edit.java或listview.java?listview.java中完成的。还可以在该方法中放置断点,以检查收到的对象是否与发送的对象相同。如果相同,则调用adapter.notifyDataSetChanged();Otherw