2010-07-22 40 views
8

Có thể cập nhật SimpleAdapter không? Tôi có một danh sách dữ liệu và chân trang có nội dung "Xem kết quả tiếp theo" Khi mục danh sách đó được nhấp, tôi nắm bắt sự kiện và nhận dữ liệu mới. Sau đó tôi muốn thay thế dữ liệu trong ListView bằng dữ liệu mới này nhưng tôi không thể tìm ra cách thực hiện. Bất kỳ ý tưởng? Tôi không muốn sử dụng một ArrayAdapter, gây ra như xa như tôi có thể nhìn thấy các mục chỉ có thể giữ một chuỗi nơi tôi cần nó để giữ nhiều chuỗi và ints.Cách cập nhật SimpleAdapter trong Android

Trả lời

10

Cập nhật: Theo del116, bạn thực sự có thể cung cấp cho SimpleAdapter một bản đồ có thể thay đổi và sau đó tự gọi phương thức của bộ chuyển đổi notifyDataSetChanged khi bạn cần danh sách cập nhật. Tuy nhiên, điểm của tôi dưới đây là viết tắt của tài liệu của SimpleAdapter chỉ rõ rằng nó là dành cho dữ liệu tĩnh; sử dụng nó cho dữ liệu có thể thay đổi được truy cập vào thiết kế của nó, vì vậy nếu bạn sử dụng kỹ thuật này, tôi chắc chắn sẽ kiểm tra xem liệu nó có tiếp tục hoạt động trong các bản phát hành Android mới khi chúng xuất hiện hay không.

(bình luận gốc sau :)

Nếu bạn nhìn vào SimpleAdapter description nó nói nó là "Một bộ chuyển đổi dễ dàng để lập bản đồ dữ liệu tĩnh quan điểm xác định trong một tập tin XML." Tôi đã thêm sự nhấn mạnh - chỉ đơn giản là, SimpleAdapater không được xây dựng để sử dụng với dữ liệu thay đổi; nó chỉ xử lý dữ liệu tĩnh. Nếu bạn không thể sử dụng ArrayAdapter vì dữ liệu của bạn có nhiều hơn một bit văn bản, thì bạn sẽ phải tự tạo ListAdapter tùy chỉnh của riêng mình hoặc đặt dữ liệu vào DB và sử dụng một trong số CursorAdapter s.

Như một phương sách cuối cùng, nếu bạn không cần nhiều hiệu suất, bạn có thể cập nhật một ListView được hỗ trợ bởi một SimpleAdapter bằng cách xây dựng một hoàn toàn mới SimpleAdapter dụ bất cứ lúc nào thay đổi dữ liệu của bạn và thông tin cho xem danh sách để sử dụng nó qua setListAdapter.

+4

Câu trả lời của bạn ở đây thực sự gây hiểu lầm. Sau khi cập nhật dữ liệu mảng và gọi notifyDataSetChanged() trên SimpleAdapter của tôi, tôi đã có thể cập nhật simpleAdapter. Không cần sử dụng ArrayAdapter để gọi notifyDataSetChanged(). – dell116

+1

@ dell116 Đủ công bằng. Tôi đã đề cập đến khả năng đó vào cuối câu trả lời của tôi, nhưng tôi đã quảng cáo nó lên hàng đầu dựa trên phản hồi của bạn rằng nó thực sự hoạt động; Tôi đã không thử nghiệm nó. Tôi vẫn duy trì rằng làm một điều như vậy đáng chú ý vì tài liệu SimpleAdapter đặc biệt nói rằng nó là dành cho dữ liệu tĩnh. –

+0

Nhìn lại lúc này ... wow. Tôi không biết gì về lập trình hoặc mục đích dự định của SimpleAdapter. Nếu bạn đang sử dụng một ListView (hoặc bất kỳ AdapterView) được hỗ trợ bởi một cấu trúc dữ liệu mà sẽ thay đổi không sử dụng SimpleAdapter. Foot.inMouth (đúng); – dell116

2

SimpleAdapter có nghĩa là cho dữ liệu tĩnh, do đó hiệu suất của bạn có thể thay đổi. Giải pháp tốt nhất có thể là chuyển sang loại bộ điều hợp khác, chẳng hạn như ArrayAdapter hoặc tạo SimpleAdapter mới mỗi khi bạn thay đổi tập dữ liệu.

3
ListView lv= (ListView) findViewById(R.id.loglist); 
ArrayList<Map<String, String>> list = buildData(); 
String[] from = { "time", "message" }; 
int[] to = { R.id.logtime, R.id.logmessage }; 

adapter = new SimpleAdapter(getApplicationContext(), list,R.layout.log_list_row, from,to); 
lv.setAdapter(adapter); 

Gọi hàm này mỗi lần cập nhật ListView. Hãy nhớ rằng bạn phải cập nhật danh sách biến với dữ liệu mới ..

Hope this helps .. :)

0

tôi đã không thể có được notifyDataSetChanged() để làm việc về việc cập nhật SimpleAdapter tôi, vì vậy thay vào đó tôi đã cố gắng đầu tiên loại bỏ tất cả các quan điểm đã được gắn liền với cách bố trí cha mẹ sử dụng removeAllViews(), sau đó thêm các ListView, và điều đó làm việc, cho phép tôi để cập nhật giao diện người dùng:

LinearLayout results = (LinearLayout)findViewById(R.id.results); 
ListView lv = new ListView(this); 
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); 
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.directory_row, 
        new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept }); 

for (...) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("name", name); 
    map.put("dept", dept); 
    list.add(map); 
} 

lv.setAdapter(adapter); 
results.removeAllViews();  
results.addView(lv); 
-2
mySimpleAdapter.notifyDataSetChanged(); 

sử dụng dòng này sau khi cập nhật dữ liệu trong dữ liệu Danh sách HashMap

+0

xin vui lòng đọc tài liệu, không thể trên SimpleAdapter như đã nêu ở trên SimpleAdapter không có nghĩa là cho các hành động như vậy. – Manny265

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