Задать вопрос
@Eserchik

Как обновить LoaderManager из Activity?

Помогите найти решение.
Есть основное Activity c ActionBar и есть ListFragment в котором отображается список.
Задача такая, при нажатии на элемент ActionBar из основного Activity обновить список в ListFragment (т.е сделать lm.getLoader(0).forceLoad()). Я не понимаю как этого сделать так как инициализация лоадера выполняется во фрагменте.

Основное Activity:

//Нажатие на элемент меню ActionBar
	public boolean onOptionsItemSelected(MenuItem item) {
	      // TODO Auto-generated method stub
                   
                   //Здесь нужно выполнить запрос на обновление списка 
                     
                   return super.onOptionsItemSelected(item);
	    }


//Создаем ListFragment
            FragmentOrdersNew fragment =new FragmentOrdersNew();
	    Bundle bundle = new Bundle();
            bundle.putString("orderStatus", "0");
            bundle.putString("tehGuid", tehGuid);
            bundle.putString("tehToken", tehToken);
            fragment.setArguments(bundle);
            fragmentManager.beginTransaction()
	                .replace(R.id.container,fragment)
	                .commit();


А вот ListFragment:
public class FragmentOrdersNew extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>{
	final static String LOG_TAG = "myLog";
	private DB db;
	private CustomAdapterOrders adapter;
	private static Cursor c;
	private LoaderManager lm;
	private View rootView;
	private static String orderStatus;
	private String tehGuid;
	private String tehToken;
	



	@Override
	  public void onActivityCreated(Bundle savedInstanceState) {
	    super.onActivityCreated(savedInstanceState);

	    
}
	
	
	@Override
	  public void onCreate(Bundle savedInstanceState) {
	    super.onActivityCreated(savedInstanceState);

	    
}
	
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		rootView = inflater.inflate(R.layout.fragment_orders, container, false);

		Bundle bundle = this.getArguments();
		orderStatus = bundle.getString("orderStatus");
		tehGuid = bundle.getString("tehGuid");
		tehToken = bundle.getString("tehToken");


		getData();


		return rootView;
	}



	private void getData(){
		

        db=new DB(getActivity());
        db.open();
        
		c = db.getData(orderStatus);

		if(c!=null && c.getCount()>0){
  
	                lm = getLoaderManager();
			lm.initLoader(0, null, this);
		
		
				String[] from = new String[] {DB.COLUMN_EXT_ID};
				int[] to = new int[] {R.id.tvExId};
				adapter = new CustomAdapterOrders(getActivity(), R.layout.orders_list, null, from, to,lm,db,orderStatus,tehGuid,tehToken);
				setListAdapter(adapter);
	
		}else{
                       TextView tvEmpty=(TextView)rootView.findViewById(android.R.id.empty);
			tvEmpty.setText(R.string.list_empty);
			tvEmpty.setVisibility(View.VISIBLE);


		}

	}



	@Override
	public Loader<Cursor> onCreateLoader(int id, Bundle args) {
		// TODO Auto-generated method stub
		 return new MyCursorLoader(getActivity(), db);
	}

	@Override
	public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
		// TODO Auto-generated method stub


			adapter.swapCursor(c); 


		

	}

	@Override
	public void onLoaderReset(Loader<Cursor> arg0) {
		// TODO Auto-generated method stub
		adapter.swapCursor(null);
	}
	
	
	static class MyCursorLoader extends CursorLoader {

	    DB db;
	    
	    public MyCursorLoader(Context context, DB db) {
	      super(context);
	      this.db = db;
	    }
	    
	    @Override
	    public Cursor loadInBackground() {
	    	 c = db.getData(orderStatus);


	     return c;
	    }
	    
	  }
	
	  public void onDestroy() {
		    super.onDestroy();
		    db.close();
		  }
}
  • Вопрос задан
  • 2650 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
anyd3v
@anyd3v
В чем именно проблема? Если я понял правильно то вам нужно onOptionsItemSelected перегрузить во фрагменте и в нем ловить нужный вам id итема и делать нужное действие.

Если не сработает то уже зависит от извращенности, что я видел
1. С помощью FragmentManagera ищется нужный фрагмент и вызывается onActivityResult
2. Шлется сообщение через BroadcastReciever (в фрагменте getActivitty().registerReciever(...))
Ответ написан
Комментировать
@wasiliysoft
Жаль что так поздно, но тем не менее предложу ответ
Может стоит перенести инициализацию лоадерменеджера в onActivityCreated и при необходимости обновить данные использовать метод лоадера onContentChanged()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы