के साथ काम कर रहे 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");
}
}
}
जादू में के
android.app.LoaderManager.LoaderCallbacks<D>
के बजायandroid.app.LoaderManager.LoaderCallbacks<D>
का उपयोग कर रहे हैं औरandroid.support.v4.content.AsyncTaskLoader<D>
यह काम करता हैं! लेकिन फिर भी मैं स्क्रीन रोटेशन के बाद अद्यतन को देखने से नहीं बच सकता, लेकिन यह किसी अन्य विषय के लिए एक सवाल है। धन्यवाद! –बस कुछ विवरण जोड़ने के लिए - "android.csupportent.AsyncTaskLoader" आयात के बजाय "android.support.v4.content.AsyncTaskLoader" का उपयोग करें। –