2017-10-09 45 views
1

我是Android的初學者。出於這個原因,我第一次設計了我的項目活動,一切正常。然後,爲了使用導航抽屜,我將我的活動改爲碎片。restartLoader()和initLoader()片段中的第三個參數

我有一個顯示的消息列表中的片段,我已經在選項菜單Like the picture below

搜索功能,我使用的裝載機填好單子。當用戶提交搜索我重新啓動加載程序的搜索結果。

我的片段:

public class NewsListFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<News>> { 

private static final int NEWS_LOADER_ID = 2; 
private NewsAdapter adapter; 

public NewsListFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_news_list, container, false); 

    setHasOptionsMenu(true); 

    if(isNetworkConnected()) { 
     // Definition NewsAdapter with empty ArrayList (new ArrayList()) and appropriation it to adapter 
     adapter = new NewsAdapter(getActivity(), 0, new ArrayList()); 
     // Set listView adapter 
     listView.setAdapter(adapter); 

     // Initialize loader 
     getActivity().getSupportLoaderManager().initLoader(NEWS_LOADER_ID, null, this); 
    } 
    else { 
     ... 
    } 
    }); 

    return view; 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.news_list_menu, menu); 

    MenuItem menuItem = menu.findItem(R.id.option_search); 
    SearchView searchView = (SearchView) menuItem.getActionView(); 

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      if (query!=null && !query.isEmpty()) { 
       Bundle bundle = new Bundle(); 
       bundle.putString("query_key", query); 
       getActivity().getSupportLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, this); 
      } 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 
    }); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getItemId()==R.id.option_settings) { 
     ... 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public Loader<List<News>> onCreateLoader(int id, Bundle args) { 
    String query = ""; 
    if (args!=null){ 
     query = args.getString("query_key"); 
    } 

    /* Definition Uri and append his relevant parameters */ 
    Uri baseUri = Uri.parse("..."); 
    Uri.Builder uriBuilder = baseUri.buildUpon(); 

    uriBuilder.appendQueryParameter("q", query); 

    /* Define NewsLoader with uri */ 
    return new NewsLoader(getActivity(), uriBuilder.toString()); 
} 


@Override 
public void onLoadFinished(Loader<List<News>> loader, List<News> newsList) { 
    adapter.clear(); 
    if(newsList!=null && !newsList.isEmpty()) { 
     adapter.addAll(newsList); 
    } 
} 


@Override 
public void onLoaderReset(Loader loader) { 
    adapter.clear(); 
} 

/* Check connectivity and network status */ 
private boolean isNetworkConnected() { 
    ... 
} 

}

符合

getActivity().getSupportLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, this); 

爲 「本」 是一個錯誤。誰說:

wrong 3rd argument type... required android.support.v4.app.LoaderManager.LoaderCallbacks<java.lang.object> 

我甚至嘗試改變這一行是這樣的:

getActivity().getSupportLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, (LoaderManager.LoaderCallbacks<List<News>>)getActivity() 

,但它崩潰,並顯示在我的logcat如下:

MainActivity不能轉換到Android .support.v4.app.LoaderManager $ LoaderCallbacks

我明白,在onCreateView()加載器沒有問題,「這個」! 但onCreateOptionsMenu()> searchView.setOnQueryTextListener()> onQueryTextSubmit 有問題!

任何人都可以告訴我,我必須寫什麼而不是「這個」來搜索?

我進口:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.Loader; 
import android.support.v7.widget.SearchView; 

回答

1

onQueryTextSubmit,這指的是要創建這是不實現LoaderManager.LoaderCallbacks<List<News>>匿名內部類,與new SearchView.OnQueryTextListener(。使用

getLoaderManager().restartLoader(NEWS_LOADER_ID, bundle, NewsListFragment.this); 

應該解決您的問題

相關問題