2012-10-23 73 views
0

我有一個ListActivity類。它有一個按鈕,它根據其屬性之一對項目進行排序。但是恰巧這個項目正在按照他們的名字排序,但是當點擊它原來的位置的項目時就會被執行。 這裏是代碼片段:如何刷新活動中的ListView

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playlist); 

     mButton = (ToggleButton) findViewById(R.id.mButton); 

     ArrayList<myObject> ListData = new ArrayList<myObject>(); 

     back = (ImageButton) findViewById(R.id.backButton); 
     label = (TextView) findViewById(R.id.likethis); 
     label.setText("List"); 
     inputSearch = (EditText) findViewById(R.id.inputSearch); 

     //Manager -- class that reads from the sdcard 
     Manager plm = new Manager(); 

     // get all files from sdcard 
     //getList() function of Manager class 
     //List declared outside oncreate() 
     this.List = plm.getList(); 

     final ArrayList<myObject> backUp = new ArrayList<myObject>(songsList); 

     if(sortCalled) { 
      mButton.setBackgroundDrawable(getResources().getDrawable(R.drawable.m_checked)); 
      mButton.setChecked(true); 
      Collections.sort(List); 

      notifyDataChanged(List); 
     } 
     else { 
      mButton.setBackground(getResources().getDrawable(R.drawable.m_unchecked)); 
      mButton.setChecked(false); 
      notifyDataChanged(backUp); 
     } 

     back.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       finish(); 
      } 

     }); 

     inputSearch.addTextChangedListener(new TextWatcher(){ 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       // TODO Auto-generated method stub 
       adapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       // TODO Auto-generated method stub 
       //ArrayList <Song> temp; 
       ((SimpleAdapter) PlayListActivity.this.adapter).getFilter().filter(s, new Filter.FilterListener() { 

        public void onFilterComplete(int count) { 
         // TODO Auto-generated method stub 
         adapter.notifyDataSetChanged(); 
        } 
       }); 
       adapter.notifyDataSetChanged(); 


      } 

     }); 

     mButton.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       if(mButton.isChecked()){ 
        mButton.setBackgroundDrawable(getResources().getDrawable(R.drawable.m_checked)); 
        Collections.sort(List); 
        sortCalled = true; 
        notifyDataChanged(List); 
       } 
       else{ 
        sortCalled = false; 
        mButton.setBackgroundDrawable(getResources().getDrawable(R.drawable.m_unchecked)); 
        notifyDataChanged(backUp); 
       } 
      } 

     }); 
    } 

    public void settingListAdapter(SimpleAdapter adapter){ 
     setListAdapter(adapter); 
     ListView lv = getListView(); 
     // listening to single listitem click 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting listitem index 
       int Index = position; 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), 
         MainActivity.class); 
       // Sending Index to MainActivity 
       in.putExtra("Index", Index); 
       setResult(100, in); 
       // Closing ListView 
       finish(); 
      } 
     }); 
    } 

    public void notifyDataChanged(ArrayList<Song> songsList) { 
     // TODO Auto-generated method stub 
     setListAdapter(null); 
     sortCalled = true; 
     ArrayList<myObject> songsListData = new ArrayList<myObject>(); 

     for (int i = 0; i < songsList.size(); i++) { 
      // creating new HashMap 
      myObject ob = sList.get(i); 

      // adding HashList to ArrayList 
      ListData.add(ob); 
     } 

     ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String,String>>(); 
     // int j = 0; 
     for(myObject i : ListData){ 
      HashMap<String, String> feed = new HashMap<String, String>(); 
      feed.put("Title", i.getTitle()); 
      array.add(feed); 

     } 
     BaseAdapter adapter1; 
     // int i = 0; 
     // Adding menuItems to ListView 
     adapter1 = new SimpleAdapter(this, array, 
       R.layout.list_item, new String[]{"Title" }, new int[] { 
         R.id.Title }); 

     setListAdapter(adapter1); 
     adapter1.notifyDataSetChanged(); 

     ListView lv = getListView(); 
     // listening to single listitem click 

     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting listitem index 
       int Index = position; 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), 
         MainActivity.class); 
       // Sending songIndex to MainActivity 
       in.putExtra("Index", Index); 
       setResult(100, in); 
       // Closing ListView 
       finish(); 
      } 
     }); 
+0

如何通過點擊任意按鈕或自動設置時間來刷新列表視圖? – Harish

+0

通過點擊任何按鈕多數民衆贊成我想要做的...不能我整合排序和刷新成一個按鈕? – Saurabh

+0

然後調用您從中獲取數據的按鈕的onclick函數以及該數據列出適配器。 – Harish

回答

1

我想你應該嘗試this.when您在listview.it的數據進行排序工作對我來說十分

adapter.notifyDataSetChanged(); 
+0

你的意思是在排序函數內? – Saurabh

+0

排序後data.also使用asynctask類來完成這項任務 –

+0

我已經在notifyDataChanged()函數中使用它。 :O不是它適當的地方使用它? – Saurabh

0

你可以嘗試Adapter.notifyDataSetChanged( )功能。它可能工作。

如果使用SimpleCursorAdapter,則在連接到適配器的光標上調用requery()將自動刷新適配器和附加視圖。

如果是BaseAdapter內容更改,則調用BaseAdapter.notifyDataSetChanged(),它會告訴ListView自行更新。

換句話說,你只需要作以下微小的變化:

public void setValue(Object newValue) { 
    this.value = newValue; 
    notifyDataSetChanged(); 
} 

實際上,因爲你改變現有項目的狀態(而不是增加新的等),然後notifyDataSetInvalidated()將是一個更好的選擇。

+0

我使用BaseAdapter ....任何它? – Saurabh

1

每當你做出改變適配器,你應該在UIThread調用notifyDataSetChanged()

請檢查this video理解的ListView更好

編輯
對於一個ArrayAdapter,如果使用notifyDataSetChanged只能add, insert, remove, and clear功能在適配器上。

當構造一個ArrayAdapter時,它將保存傳入的List的引用。如果您要傳入一個屬於Activity的List並稍後更改該Activity成員,ArrayAdapter仍然保持對原始列表的引用。適配器不知道您在活動中更改了列表。

你的選擇是:

使用一個ArrayAdapter的功能修改底層列表(add, insert, remove, clear, etc.) 重新創建新的目錄數據一個ArrayAdapter。 (使用大量資源和垃圾回收。) 創建您自己的派生自BaseAdapter和ListAdapter的類,它允許更改基礎List數據結構。 每次列表更新時都使用notifyDataSetChanged。要在UI線程上調用它,請使用Activity的runOnUiThread方法。那麼notifyDataSetChanged將起作用。

+0

我也這麼做過... – Saurabh

+0

什麼是notifyDatachanged()?你爲什麼使用它? –

+0

正如我告訴過你,我試圖對它們進行排序,所以我有一個備份arraylist和一個排序列表,我只是將它們中的任何一個發送到notifyDataChanged()函數,該函數在適配器中進行設置。我認爲每次調用函數時都要分配一個新的適配器可以遏制這個問題,但事實並非如此。 – Saurabh