2012-10-24 18 views
5

Câu hỏi java đơn giản hy vọng tôi vừa quên hoặc không bao giờ hiểu được. Tôi đã chơi với bộ tải trong Android 4.0. Chương trình đang hoạt động nhưng giờ tôi đang tìm đến phần 'tiếp theo'. Tôi muốn một bộ nạp Cursor tiêu chuẩn và một AsyncTaskLoader tùy chỉnh. Tôi đang mắc kẹt trên phần 1 cố gắng chuyển đổi một cursorLoader thành một Loader và trả về nó.Cách truyền tải cursorLoader tới Trình tải <Object>

@Override 
    //public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    public Loader<Object> onCreateLoader(int id, Bundle args) { 

     if (id == LISTVIEWLOADER) { 
      String[] projection = { RunnerTable.COLUMN_ID, 
        RunnerTable.COLUMN_NAME }; 
      CursorLoader cursorLoader = new CursorLoader(getActivity(), 
        FanContentProvider.CONTENT_URI, projection, null, null, 
        null); 


      return cursorLoader; //HERE IS THE PROBLEM 
     } 
     return null; 
    } 

Loại không khớp không thể chuyển đổi từ CursorLoader thành Trình tải.

tôi tin rằng có thể làm cho nó làm việc với

public class MainFragment extends ListFragment implements 
     //LoaderManager.LoaderCallbacks<Cursor> 
     LoaderManager.LoaderCallbacks 

Nhưng không thích những cảnh báo:

LoaderManager.LoaderCallbacks là một loại nguyên liệu. Tài liệu tham khảo cho kiểu chung LoaderManager.LoaderCallbacks nên được tham số

Cảm ơn bạn đã hỗ trợ bạn có thể cung cấp.

Trả lời

2

Thay đổi

public Loader<Object> onCreateLoader(int id, Bundle args) { 

để

public Loader<? extends Object> onCreateLoader(int id, Bundle args) { 

tuyên bố đầu tiên kể JVM, kiểu trả về là bê tông Object. Tuyên bố mới cho biết jvm rằng bất kỳ TYPE nào là Object.

Vui lòng đọc số tutorial này.

+2

Sợ rằng vẫn không hiệu quả. Kiểu trả về không tương thích với LoaderManager.LoaderCallbacks .onCreateLoader (int, Bundle). – jimsis

7

Kiểm tra nhập khẩu, bạn mis có thể sử dụng những 2:

import android.content.CursorLoader; 

import android.support.v4.content.CursorLoader; 
+1

Chào mừng bạn đến với Stackoverflow! Câu trả lời của bạn sẽ hữu ích hơn nhiều nếu bạn đánh dấu chính xác những hàng nhập này bị lạm dụng như thế nào. – mvp

-1

Có xem xét này: Android AsyncTaskLoader Reference

Tôi tin rằng vấn đề của bạn nằm ở dòng này :

public class MainFragment extends ListFragment implements 
    //LoaderManager.LoaderCallbacks<Cursor> 
    LoaderManager.LoaderCallbacks 

Bạn nên thay đổi một cái gì đó như thế này:

public static class AppListFragment extends ListFragment 
    implements LoaderManager.LoaderCallbacks<List<AppEntry>> 
29

Mặc dù đây là một chủ đề cũ, nó vẫn chưa được trả lời đầy đủ. Vấn đề ở đây đã được xúc động bởi tch0106, nhưng không được mô tả đầy đủ.

Tôi vừa gặp sự cố tương tự và giải quyết vấn đề trong phần nhập. Nói một cách đơn giản: Sử dụng Loader hỗ trợ, CursorLoader và LoaderCallbacks cùng nhau.

Một số lớp học có thể được tìm thấy trong cả thư viện Android địa phương cũng như thư viện hỗ trợ. Không trộn các thư viện hỗ trợ với các phiên bản thư viện không hỗ trợ.

// Use these together 
import android.support.v4.content.CursorLoader; 
import android.support.v4.app.LoaderManager.LoaderCallbacks; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.SimpleCursorAdapter; 

// Or use these, but don't mix and match 
import android.content.CursorLoader; 
import android.content.Loader; 
import android.app.LoaderManager.LoaderCallbacks; 
import android.widget.SimpleCursorAdapter; 
+0

Điều này làm việc cho tôi. Tôi đã nhập tệp android.support.v4.content.CursorLoader nhập với nhập android.app.LoaderManager.LoaderCallbacks. Cảm ơn vì đã giúp tôi tìm thấy điều này một cách nhanh chóng. Ai đó nên đánh dấu đây là câu trả lời đúng. –

+0

Đã không làm việc cho tôi: ( – Brandon

+0

làm việc man !! tuyệt vời !! xin vui lòng đánh dấu nó như là câu trả lời. – eRaisedToX

0

Tôi đã giải quyết vấn đề của tôi, rất giống với trang này, bằng cách thay đổi một nhập khẩu ... Tôi đã sai lầm, khi tôi tuyên bố là bộ nạp tùy chỉnh.

// My custom loader java class: 

import android.content.Context; 
import android.content.AsyncTaskLoader; //this was the place of my mistake right here 
import java.util.ArrayList; 

public class ArticleLoader extends AsyncTaskLoader<ArrayList<Article>> { 

    public ArticleLoader(Context context){ 
     super(context); 
    } 

    @Override 
    protected void onStartLoading() { 
     forceLoad(); 
    } 

    @Override 
    public ArrayList<Article> loadInBackground() { 
     ArrayList<Article> articles = QueryUtils.fetchArticles(getContext()); 
     return articles; 
    } 
} 

Vì vậy, điều xảy ra là tôi không chú ý đủ và Android Studio đã tự động nhập 'android.support.v4.content.AsyncTaskLoader'.

Hy vọng điều này sẽ giúp ai đó!

Ton