2017-10-09 44 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); 

应该解决您的问题

相关问题