2016-06-29 5 views
6

के साथ काम कर रहे CreateLoader पर विधि में असंगत प्रकार I AsyncTaskLoader और Fragment (https://gist.github.com/codeswimmer/884591) के साथ काम करने के कुछ उदाहरण मानते हैं और मैंने ऐसा करने की कोशिश की। लेकिन अब मैं असंगत प्रकार की त्रुटि को ठीक नहीं कर सकता - क्रिएटलोडर पर विधि में। मुझे नहीं पता कि ऐसा क्यों होता है, क्योंकि मैंने वही किया है।AsyncTaskLoader और Fragment

FeedLoader.java

public class FeedLoader extends AsyncTaskLoader<ArrayList<RSSItemData>> { 

    ArrayList<RSSItemData> listData; 
    Context ctx; 
    RSSItemData rssItem; 
    final Integer HTTP_CONNECTION_TIMEOUT = 15; 
    DBHelper dbHelper; 


    public FeedLoader(Context context) { 
     super(context); 
     this.ctx = context; 
     dbHelper = new DBHelper(ctx); 
    } 


    @Override 
    public ArrayList<RSSItemData> loadInBackground() { 

     listData = new ArrayList<RSSItemData>(); 

     if(!BaseUtils.isNetworkAvailable(ctx)) return getNewsFromDB(); 

     if(doWeHaveAnyNews()){ 

      Log.d("myLogs", "We have news!"); 

      String data = JSONUtils.getJSON("http://I-changed-URL.com", HTTP_CONNECTION_TIMEOUT*1000, ctx); 
      JSONResult result = new Gson().fromJson(data, JSONResult.class); 
      listData = result.items; 

      deleteAllNewsFromDB(); 
      putNewsIntoDB(listData); 

     } 
     else{ 

      Log.d("myLogs", "No news, retrieve from database"); 
      listData = getNewsFromDB(); 

     } 

     Log.d("myLogs", "Size of listData - " + listData.size()); 

     return listData; 
    } 

    public boolean doWeHaveAnyNews() {...} 
    public void putNewsIntoDB(ArrayList<RSSItemData> listData) {...} 
    public void deleteAllNewsFromDB() {...} 
    public ArrayList<RSSItemData> getNewsFromDB() {...} 

} 

RetrieveFeedFragment.java

public class RetrieveFeedFragment extends Fragment implements LoaderManager.LoaderCallbacks<ArrayList<RSSItemData>> { 

    private RecyclerView rvNews; 
    LinearLayout progBarLinearLayout; 
    ProgressBar progBar; 
    TextView progBarText; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 

     getActivity().getSupportLoaderManager().initLoader(0, null, this).forceLoad(); 

     Log.d("myLogs", "Fragment onCreate"); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     Log.d("myLogs", "Fragment onCreateView"); 

     View v = inflater.inflate(R.layout.news_list_fragment, null); 

     rvNews = (RecyclerView) v.findViewById(R.id.listViewNews); 
     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     rvNews.setLayoutManager(llm); 
     rvNews.setHasFixedSize(true); 

     rvNews = (RecyclerView) v.findViewById(R.id.listViewNews); 

     progBarLinearLayout = (LinearLayout) v.findViewById(R.id.progressBarLinearLayout); 
     progBar = (ProgressBar) v.findViewById(R.id.progressBar); 
     progBarText = (TextView) v.findViewById(R.id.progressBarText); 

     return v; 

    } 


    @Override 
    public Loader<ArrayList<RSSItemData>> onCreateLoader(int id, Bundle args) { 
     return new FeedLoader(getActivity()); 
     /* Incompatible types ERROR 
     Required - anroid.support.v4.content.Loader <java.util.ArrayList<com.project.myproject.RetrieveFeed.RSSItemData>> 
     Found - com.project.myproject.RetrieveFeed.FeedLoader 
     */ 
    } 

    @Override 
    public void onLoadFinished(Loader<ArrayList<RSSItemData>> loader, ArrayList<RSSItemData> listData) { 
     // RSSAdapter = new RSSAdapter(listData, getActivity()); 
     // rvNews.setAdapter(RSSAdapter); 
     // progBarLinearLayout.setVisibility(LinearLayout.GONE); 
     Log.d("myLogs", "onLoadFinished"); 
    } 
    @Override 
    public void onLoaderReset(Loader<ArrayList<RSSItemData>> loader) { 
     Log.d("myLogs", "onLoaderReset"); 
    } 
} 

MainActivity.java (सिर्फ मामले में)

public class MainActivity extends FragmentActivity { 

    RetrieveFeedFragment fragment;; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if(savedInstanceState == null){ 
      fragment = new RetrieveFeedFragment(); 
      getSupportFragmentManager().beginTransaction().add(R.id.fragment_news, fragment, "retrieve_feed_tag").commit(); 
      Log.d("myLogs", "New Fragment in Activity"); 
     } 
     else{ 
      fragment = (RetrieveFeedFragment) getSupportFragmentManager().findFragmentByTag("retrieve_feed_tag"); 
      Log.d("myLogs", "Get old Fragment by tag in Activity"); 
     } 

    } 
} 

उत्तर

6

अपने आयात की जांच करें। सुनिश्चित करें कि आप अपने FeedLoader

+0

जादू में के android.app.LoaderManager.LoaderCallbacks<D> के बजाय android.app.LoaderManager.LoaderCallbacks<D> का उपयोग कर रहे हैं और android.support.v4.content.AsyncTaskLoader<D> यह काम करता हैं! लेकिन फिर भी मैं स्क्रीन रोटेशन के बाद अद्यतन को देखने से नहीं बच सकता, लेकिन यह किसी अन्य विषय के लिए एक सवाल है। धन्यवाद! –

+0

बस कुछ विवरण जोड़ने के लिए - "android.csupportent.AsyncTaskLoader" आयात के बजाय "android.support.v4.content.AsyncTaskLoader" का उपयोग करें। –

संबंधित मुद्दे