5

Tôi đang sử dụng một ListAdapter để cư một ListView như thế này:Làm thế nào để thiết lập lại các ListView với ArrayAdapter sau khi lấy dữ liệu

static final String[] PROBLEMS = new String[] {"one", "two", "three" }; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState);   

    setListAdapter(new ArrayAdapter<String>(this, R.layout.my_problems, PROBLEMS)); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

và sau đó tôi đang thực hiện cuộc gọi từ xa đến máy chủ của tôi để có thêm dữ liệu cho danh sách đó với cuộc gọi AsyncTask và khi tôi lấy lại dữ liệu từ máy chủ, tôi không biết cách điền và đặt lại ListView. Cho đến nay tôi có một cái gì đó như thế này:

@Override 
    protected void onPostExecute(String result) 
    {  
      // Unwrap the stuff from the JSON string     
      String problem_title = null; 
      String problem_id = null; 

      try 
      { 
       JSONArray obj = new JSONArray(result); 
       JSONObject o = obj.getJSONObject(0);      

       Log.d("Title: " , "" + o.getString("problem_title"));  
       Log.d("id: " , "" + o.getString("problem_id"));  

       problem_title = o.getString("problem_title"); 
       problem_id = o.getString("problem_id"); 
      } 
      catch (Exception e) 
      { 
      } 

      // Now not sure what to do :) 
      // How do I reset the list that I had set up above? 
       } 

Tôi có thể đưa kết quả vào dữ liệu có cấu trúc thích hợp để đặt lại danh sách nhưng không chắc chắn cách thực hiện. Ai đó có thể giúp đỡ? :)

Trả lời

16

tôi sử dụng nó theo cách này,

values = new ArrayList<String>(); 
    //put anything you want in values as start 
    adapter = new ArrayAdapter<String>(this,R.layout.notification, values); 
    setListAdapter(adapter); 

sau đó

//change values array with your new data then update the adapter 
    adapter.notifyDataSetChanged(); 

sau đó nội dung listview sẽ thay đổi tại thời điểm bạn thực hiện chức năng này

+0

Hãy để tôi thử ngay bây giờ ... Tôi sẽ cho bạn biết cách thực hiện :) – GeekedOut

+0

ah ok, nó đang được biên soạn! Cảm ơn! – GeekedOut

+0

Không sao, chúc may mắn –

3
adapter.notifyDataSetChanged(); 

là lựa chọn tốt để làm điều này, nhưng đôi khi điều đó sẽ không hoạt động như chúng ta cần. Trong trường hợp đó bạn có thể setadapter một lần nữa và listview của bạn được làm mới. Nhưng đây không phải là lựa chọn tốt để làm bởi vì nó genrates toàn bộ listview một lần nữa để điều này gây ra hiệu suất rất xuống. Và ứng dụng của bạn bị chậm.

7

Bạn không cần phải khởi tạo lại bộ điều hợp, nếu bạn chỉ muốn thay đổi tập dữ liệu. Hãy thử mã sau -

adapter.clear(); 
for(int i = 0;i<categoriesArray.length;i++){ 
    adapter.add(categoriesArray[i]); 
} 

sau đó nếu được yêu cầu, bạn cũng có thể thông báo thay đổi cho bộ điều hợp, mặc dù không cần thiết.

adapter.notifyDataSetChanged(); 

nếu bạn đang nhắm mục tiêu API cấp 11 trở lên, bạn có thể sử dụng phương thức addAll() trên bộ điều hợp. Vì nó hiệu quả hơn.

adapter.clear(); 
adapter.addAll(categoriesArray); 
Các vấn đề liên quan