10

Tôi có một ứng dụng Android có màn hình bao gồm ListView, mà tôi đang sử dụng để hiển thị danh sách thiết bị. Các thiết bị này được giữ trong một mảng.Bộ chuyển đổi Array Android với ArrayList và ListView không cập nhật khi danh sách đã thay đổi

Tôi đang cố gắng sử dụng ArrayAdapter để hiển thị những gì nằm trong mảng trên màn hình trong danh sách.

Nó hoạt động khi tôi lần đầu tiên nạp lớp SetupActivity, tuy nhiên, đó là cơ sở để thêm một thiết bị mới trong AddDevice() phương pháp, có nghĩa là mảng giữ các thiết bị được cập nhật.

Tôi đang sử dụng thông báoDataSetChanged() cần phải cập nhật danh sách nhưng có vẻ như không hoạt động.

public class SetupActivity extends Activity 
{ 
    private ArrayList<Device> deviceList; 

    private ArrayAdapter<Device> arrayAdapter; 

    private ListView listView; 

    private DevicesAdapter devicesAdapter; 

    private Context context; 

    public void onCreate(Bundle savedInstanceState) //Method run when the activity is created 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.setup); //Set the layout 

     context = getApplicationContext(); //Get the screen 

     listView = (ListView)findViewById(R.id.listView); 

     deviceList = new ArrayList<Device>(); 

     deviceList = populateDeviceList(); //Get all the devices into the list 

     arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); 

     listView.setAdapter(arrayAdapter); 
    } 

    protected void addDevice() //Add device Method (Simplified) 
    { 
     deviceList = createNewDeviceList(); //Add device to the list and returns an updated list 

     arrayAdapter.notifyDataSetChanged(); //Update the list 
} 
} 

Có ai có thể thấy tôi đang đi đâu không?

Trả lời

36

Đối với một ArrayAdapter, notifyDataSetChanged chỉ hoạt động nếu bạn sử dụng add, insert, remove, và clear chức năng trên Adapter.

  1. Sử dụng rõ ràng để xóa adapter - arrayAdapter.clear()
  2. Sử dụng Adapter.add và thêm danh sách mới được thành lập - arrayAdapter.add(deviceList)
  3. Gọi notifyDataSetChanged

Alternatives:

  1. Lặp lại bước này sau khi bảng giá trị mới được hình thành - nhưng đây là dự phòng

    arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); 
    
  2. Tạo lớp học riêng của bạn bắt nguồn từ BaseAdapter và ListAdapter mà mang lại cho bạn sự linh hoạt hơn. Điều này được khuyến khích nhất.
0

phương thức addDevice của bạn đang gây ra vòng lặp vô tận. Đừng gọi một phương thức từ bản thân như bạn đang làm gì ở đây:

deviceList = addDevice(); 
+0

bận tâm, đó chỉ là lỗi đánh máy trên phần của tôi ... xin lỗi vì sự nhầm lẫn –

+0

hey pippa, nó thật tuyệt, không to tát. – petey

+0

bạn có thể đăng createNewDeviceList của bạn(), rất có thể là nó không thêm bất cứ điều gì mới vào danh sách của bạn và tạo danh sách mới với cùng một yếu tố và thứ tự trong bản gốc – petey

9

Khi câu trả lời được chấp nhận giải quyết được vấn đề, giải thích tại sao không chính xác và vì đây là một khái niệm quan trọng tôi nghĩ tôi sẽ cố làm rõ. Giải thích của Slartibartfast rằng notifyDataSetChanged() chỉ hoạt động khi add, insert, remove hoặc clear được gọi trên bộ điều hợp không chính xác. Giải thích đó đúng với phương pháp setNotifyOnChange(), nếu được đặt thành true (như mặc định) sẽ tự động gọi notifyDataSetChanged() khi bất kỳ hành động nào trong số bốn hành động đó xảy ra. Tôi nghĩ rằng các poster bối rối hai phương pháp. notifyDatasetChanged() chính nó không có những hạn chế đó. Nó chỉ cho bộ điều hợp biết rằng danh sách mà nó đang xem đã thay đổi và không quan trọng việc thay đổi danh sách thực sự đã xảy ra như thế nào. Mặc dù tôi không thể thấy mã nguồn cho số createNewDeviceList() của bạn, nhưng tôi cho rằng sự cố của bạn xuất phát từ thực tế là bạn đã có bộ điều hợp tham chiếu danh sách gốc bạn đã tạo và sau đó bạn tạo danh sách mới trong createNewDeviceList() và bộ điều hợp vẫn còn chỉ vào danh sách cũ, nó không thể thấy những thay đổi.Giải pháp slartibartfast đã đề cập đến hoạt động vì nó xóa bộ điều hợp và đặc biệt thêm danh sách được cập nhật vào bộ điều hợp đó. Vì vậy, bạn không có vấn đề của bộ chuyển đổi của bạn trỏ đến địa điểm sai. Hy vọng điều này sẽ giúp một ai đó!

Các vấn đề liên quan