2010-11-16 30 views
48

Cuốn sách của tôi, "Hello Android" cho điều này như một cách để sử dụng một helper tùy chỉnh db, thiết lập một con trỏ, và sau đó thiết lập một bộ chuyển đổi như sau:cách tốt nhất để Refresh Adaptor/ListView trên Android

Cursor cursor 
CustomDatabaseHelper test = new CustomDatabaseHelper(this); 
try { 
     cursor = getData(); 
     showData(cursor); 
} finally { 
     test.close(); 
} 

Với điều này tuy nhiên, mỗi khi tôi cần làm mới tập dữ liệu, tôi cần tiếp tục chạy khối mã này (một chút khó khăn bên trong nút onClick() cho nút "này" không khả dụng.

Đây có phải là cách tốt nhất để làm mới tập dữ liệu hay tôi nên tìm cách loại bỏ .đóng và phát hành bộ điều hợp.notifyDataSetChanged()? Nếu tôi làm điều này, đôi khi tôi nhận được lực gần như (và tôi không thể nhớ tại thời điểm này) nhưng đôi khi nó không thể xóa đúng cách - tôi nghĩ điều này có thể là do cơ sở dữ liệu hiện đang mở và nó cố mở lại.

Chúng ta có nên khai báo các biến cho các con trỏ, DatabaseHelpers và bộ điều hợp trong lớp (ngoài OnCreate) để chúng có thể truy cập được tất cả các hàm không?

Tôi nhận ra đây chỉ là chương trình kém ở giai đoạn này, nhưng tôi đang cố gắng tìm một số gợi ý về cách làm tốt nhất.

+0

Chỉ cần một sidenote: Mọi thứ hơi khác nếu bạn sử dụng nhà cung cấp nội dung và Trình quản lý tải. Xem: http://stackoverflow.com/a/19657500/1087411 – Anderson

Trả lời

81

Bạn nên sử dụng adapter.notifyDataSetChanged(). Các bản ghi sẽ nói gì khi bạn sử dụng?

+1

Cảm ơn Macarse, Điều đó không có tác dụng, nhưng chỉ khi tôi không thực hiện .đóng vào trình trợ giúp cơ sở dữ liệu. Tôi cũng nghĩ điều gì sẽ xảy ra nếu tôi không thực hiện .close, hệ thống sẽ cố gắng mở quá nhiều cơ sở dữ liệu và rơi xuống. Cơ sở dữ liệu có nên mở trong vòng đời của hoạt động sau đó không? – Simon

+0

Bạn nên sử dụng http://developer.android.com/reference/android/app/Activity.html#startManagingCursor(android.database.Cursor) để quản lý con trỏ bên trong Hoạt động. – Macarse

9

mã sau hoạt động hoàn hảo đối với tôi

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter(); 
adp.UpdateDataList(EfficientAdapter.MY_DATA); 
adp.notifyDataSetChanged(); 
QuickList.invalidateViews(); 
QuickList.scrollBy(0, 0); 
+1

Gọi notificationDataSetChanged() không đủ cho tôi. invalidateViews() thay vào đó hoạt động. –

16

Chỉ cần thêm những mã trước khi thiết lập Adapter nó làm việc cho tôi:

listView.destroyDrawingCache(); 
    listView.setVisibility(ListView.INVISIBLE); 
    listView.setVisibility(ListView.VISIBLE); 

Hoặc trực tiếp bạn có thể sử dụng phương pháp dưới đây sau khi tài nguyên thay đổi dữ liệu.

adapter.notifyDataSetChanged() 
+1

Điều này cũng áp dụng cho các Nút: \t \t // Buộc làm mới \t \t myButton.setVisibility (Button.INVISIBLE); \t \t myButton.setVisibility (Button.VISIBLE); – hornetbzz

+1

cho mục đích gì bạn phải làm mới nút của mình? – sravan

+0

sau một bộ lọc và sau đó bộ lọc của nó được áp dụng. – hornetbzz

0

Nếu bạn đang sử dụng LoaderManager thử với tuyên bố này:

getLoaderManager().restartLoader(0, null, this); 
-2

chỉ cần viết trong Tuỳ chỉnh ArrayAdaper bạn mã này:

public void swapItems(ArrayList<Item> arrayList) { 
    this.clear(); 
    this.addAll(arrayList); 
} 
0
adapter.notifyDataSetChanged(); 
+0

Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ có mã và "dùng thử" này không được khuyến khích, bởi vì chúng không chứa nội dung có thể tìm kiếm được và không giải thích tại sao một người nào đó nên "thử cái này". – abarisone

+0

trên Tìm kiếm bạn muốn làm mới bộ điều hợp? –

0

Có lẽ vấn đề của họ là thời điểm mà tìm kiếm được thực hiện trong cơ sở dữ liệu. Trong chu kỳ Fragment Override của ông Fragment.java của nó để tìm ra chỉ: cố gắng thử nghiệm với các phương pháp:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here 
    Log.i("FragmentX", "Step OnCreateView");// Try with it 
    return rootView; 
} 

Hãy thử nó tương tự như đặt Log.i ... "onStart" và "onResume".

Cuối cùng cắt mã trong "onCreate" e đặt nó trong "onStart" ví dụ:

@Override 
public void onStart(){ 
    super.onStart(); 
    Log.i("FragmentX","Step OnStart"); 
    dbManager = new DBManager(getContext()); 
    Cursor cursor = dbManager.getAllNames(); 
    listView = (ListView)getView().findViewById(R.id.lvNames); 
    adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter 
    adapter.notifyDataSetChanged(); 
    listView.setAdapter(adapter); 
} 
0

Chỉ cần viết trong Tuỳ chỉnh của bạn ArrayAdaper mã này:

private List<Cart_items> customListviewList ; 

refreshEvents(carts); 

public void refreshEvents(List<Cart_items> events) 
{ 
    this.customListviewList.clear(); 
    this.customListviewList.addAll(events); 
    notifyDataSetChanged(); 
} 
5

cách tốt nhất để Làm mới Adapter/ListView trên Android

Không chỉ gọi notifyDataSetChanged() sẽ làm mới dữ liệu ListView, setAdapter() phải được gọi trước để tải thông tin một cách chính xác:

listView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
Các vấn đề liên quan