簡體   English   中英

完成上一個活動后如何刷新活動中的列表視圖?

[英]How to refresh a listview in an Activity after finishing the previous Activity?

我的活動之間的互動:

  1. 在listview.java中的listview中單擊一行>

  2. 轉到Edit.java以編輯有關該特定行的信息>

  3. 完成編輯后,單擊按鈕,將完成edit.java活動>

  4. 返回到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);

}

來自步驟1、2和3的數據流。

listview.java:

// 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活動中使用startActivityForResult()啟動編輯活動
  • 在編輯活動中,完成用戶操作后,使用setResult()finish()返回到listview活動
  • 在listview活動中使用onActivityResult()來檢查您是否退出了edit活動,如果是,請從數據庫中重新加載數據並使用listview的notifyDataSetChanged()

這只是基本的工作流程,可以進行各種優化。

以下代碼演示了列表視圖的基本實現。

在活動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);

在對字符串數組(即值)進行添加/刪除/更新之后,然后調用適配器。notifydatasetchanged(); 例如:在我的示例中,values數組中有8個項目:

    values[7] = "Android Example List View";
    adapter.notifyDataSetChanged();

然后,您將看到列表視圖已更新。 實際上,您的適配器采用了Array,然后將該數據發送到列表視圖。 Listview直接不處理字符串數組。 每次對數組執行某種CRUD操作時,都調用adapter.notifyDataSetChanged();。 以便列表視圖反映您所做的更改。 在應用過程中,我通常將Array換成Arraylist,因為這使添加和刪除變得更加容易。

那里有很多問題。 首先,您要按意圖發送該對象的屬性,而不是對象本身。 最快的方法(不是最好的方法)是發送對象(SalesItemInformationLV saleitem2)。 為此,該對象需要實現Serializable接口。

這是傳遞可序列化對象的方法: 使用Serializable通過意圖傳遞數據

使用此解決方案很重要: https : //developer.android.com/training/basics/intents/result.html?hl=zh-419

然后,在onActivityResult()中,應調用adapter.notifyDataSetChanged();。

請記住,將適配器聲明為全局屬性(方法之外)。

您可以使用adapter.notifyDataSetChanged(); 在onResume方法活動中,但最好使用startActivityForResultsetResult方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM