2017-10-09 14 views
1

私はAndroidの初心者です。この理由から私は最初に私のプロジェクトに活動をデザインしました。次に、ナビゲーション・ドロワーを使用するために、自分の活動を断片に変えます。restartLoader()とinitLoader()フラグメントの第3引数

私はニュースの一覧を表示するフラグメントを持っている、と私はリストに記入し、ローダを使用オプションメニュー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はアンドロイドにキャストすることはできません.support.v4.app.LoaderManager $ LoaderCallbacks

私はonCreateView()のローダーが "this"に問題がないことを理解しました! では、onCreateOptionsMenu()> searchView.setOnQueryTextListener()> onQueryTextSubmit に問題があります。

"this"の代わりに何を書かなければならないのですか?

私の輸入: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

、これはLoaderManager.LoaderCallbacks<List<News>>を実装していないnew SearchView.OnQueryTextListener(で、作成している匿名の内部クラスを指します。あなたの問題を解決する必要があり

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

を使用し

関連する問題