Как правильно перезаполнить tab? LoaderManager..

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
ivied
Сообщения: 15
Зарегистрирован: 08 мар 2013, 03:04

Как правильно перезаполнить tab? LoaderManager..

Сообщение ivied » 10 апр 2013, 16:05

Всем привет. Есть FragmentActivity, заполненная tabами c ListFragment .которые заполняются через LoaderManager. при смене табов криво обновляется содержимое. Допустим у меня есть два таба Tab1 Tab2 . когда я кликаю по Tab1 вся информаия отображиается верно. потом кликаю Tab2 тоже все нормально. потом опять Tab1 и тут вылазит либо просто пустое пространсто либо заполнененное неверное информацией(если tab был пуст). посмотрел через debug отличие первого от второго клика на Tab1 в том что в первом случае в переменных приходят this и savedInstanceState =nul, а во втором приходит Loder c данными . Пытался убить Loader в onDestroy taba lm.destroyLoader(this.getTag().toString().hashCode()), но тогда каждый непустой tab при пересоздании просто дает ошибку. так же для каждого tab создается Loader c собственным ID lm.initLoader(this.getTag().toString().hashCode(), null, mCallbacks); Поиск в гугле адекватных результатов не дал. Помогите пожалуйста перезаполнить Tabы

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Как правильно перезаполнить tab? LoaderManager..

Сообщение neoksi » 10 апр 2013, 16:41

ivied
Код в студию, а то так, мы понять не можем, что не так.

ivied
Сообщения: 15
Зарегистрирован: 08 мар 2013, 03:04

Re: Как правильно перезаполнить tab? LoaderManager..

Сообщение ivied » 10 апр 2013, 17:53

neoksi писал(а):ivied
Код в студию, а то так, мы понять не можем, что не так.

Код: Выделить всё

public class ChatList extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnClickListener {
	final  String LOG_TAG = "myLogs";
	final Uri CONTACT_URI = Uri.parse("content://ivied.p001astreamchat/chats");
	public String [] selectionArgs ;
	String chatName;
	ChatCursorAdapter adapter;
	Button enter, footer;
	EditText textOfMessage;
	 String selection = ""; 
	
//	AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
	SharedPreferences preferences;
	 private LoaderManager.LoaderCallbacks<Cursor> mCallbacks;
	 private static final int LOADER_ID = 1;
	 LoaderManager lm ;
	 DialogFragment dlg1;              
	 @Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
		{	
		 container.removeAllViews();
		
		 Log.i(LOG_TAG, "onCrateView"); /*  */
		 return inflater.inflate(R.layout.chat, container, false); } 
	
	 
	
	
	 @Override
	  public void onActivityCreated(Bundle savedInstanceState) {
	    super.onActivityCreated(savedInstanceState);
	    Log.i(LOG_TAG, "onActivityCreated"); 
	    footer = (Button)getActivity().findViewById(R.id.footer);
		 footer.setOnClickListener(this);
		 enter = (Button)getActivity().findViewById(R.id.enter);
		 enter.setOnClickListener(this);
		 textOfMessage = (EditText) getActivity().findViewById (R.id.textOfMessage);
		 dlg1 = new DialogSendChannels();
	 
	    String[] from = new String[] { MyContentProvider.MESSAGES_SITE_NAME, MyContentProvider.MESSAGES_NICK_NAME, MyContentProvider.MESSAGES_MESSAGE, MyContentProvider.MESSAGES_CHANEL  };
	    int[] to = new int[] { R.id.ivImg, 0,R.id.tvText, R.id.channelName };
	 // Initialize the adapter.
	    adapter = new ChatCursorAdapter(getActivity(), 
	   		R.layout.message, null, from, to, 0);
	 // Associate the (now empty) adapter with the ListView.
	    if (adapter == null) {
	    	adapter = new ChatCursorAdapter(getActivity(), 
		    		R.layout.message, null, from, to, 0); }
	    ListView lvData = (ListView) getActivity().findViewById(android.R.id.list);
	    lvData.setAdapter(adapter);

	    ;

	    mCallbacks = this;
	    	  lm = getLoaderManager();
		  
		    lm.initLoader(this.getTag().toString().hashCode(), null, mCallbacks);
		    Log.i(LOG_TAG, "" + this.getTag().toString().hashCode());
	  
		    
	 }
	 
	 @Override public void  onResume (){
		 super.onResume();
		 Log.i(LOG_TAG, "resume");
		
	    	
		
	 }
	 @Override
	 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
		// считываем каналы из файла
		
		 			String chatName = this.getTag();
		 			
				 File chatPath = new File (getActivity().getFilesDir () + "/chats/" + chatName);
				 
				 try {
				 preferences = getActivity().getSharedPreferences(chatName, 0);
				 preferences.edit().clear().commit();	
				 }catch (NullPointerException e) {
				      e.printStackTrace();
				  }
				 Editor ed = preferences.edit();
				 List<String> channels = new ArrayList<String>();
				 try {
				      // открываем поток для чтения
				      BufferedReader br = new BufferedReader(new FileReader(chatPath));
				      String str = "";
				      // читаем содержимое
				      
				      while ((str = br.readLine()) != null) {
				    	  String channelBySite[] = str.split(" ");
				    	  String site = channelBySite[0];
				    	  selectionArgs = new String[channelBySite.length-1];
				    	  if (site.equals("sc2tv")) { for (int a =1; a < channelBySite.length; a++){ channels.add(channelBySite[a]); Log.i(LOG_TAG, channels.toString());ed.putString(channelBySite[a], "0");ed.commit();}}
				      }
				     
				      
				 }  catch (FileNotFoundException e) {
				      e.printStackTrace();
				  } catch (IOException e) {
				      e.printStackTrace();
				  }
				
				 String[] selectionArgs = new String[channels.size()];
				 selectionArgs = channels.toArray(selectionArgs);
				 //String [] selectionArgs = { "67822","23462"};
				 
				 
				
				 
				 for (int i=0; i < channels.size(); i++) { if (i>0) selection = selection.concat("OR ");selection = selection.concat("channel = ? ");} 
				 
		 Loader<Cursor> mLoader = new CursorLoader(getActivity(), CONTACT_URI, null, selection, selectionArgs, null); 
		 
	    return mLoader;
		  
	 }

		@Override
		public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
						
			// Swap the new cursor in. (The framework will take care of closing the
		    // old cursor once we return.)
			
			adapter.swapCursor(data);
			setSelection(data.getCount());
			
		    // The list should now be shown.
			/* if (isResumed()) {
		            setListShown(true);
		        } else {
		            setListShownNoAnimation(true);
		        }*/
		    
		}
		
		@Override
		public void onLoaderReset(Loader<Cursor> loader) {
			
		    // This is called when the last Cursor provided to onLoadFinished()
		    // above is about to be closed. We need to make sure we are no
		    // longer using it.
			adapter.swapCursor(null);
		}
		
		 public void onClick(View v) {
				switch (v.getId()) {
			    case R.id.footer :
			    	 dlg1 =  DialogSendChannels.newInstance(this.getTag().toString());
			    	dlg1.show(getFragmentManager(), this.getTag().toString()); 
	
			    	break;
			    case R.id.enter:
			    	if (!(textOfMessage.getText().toString().equals(""))) {
			    		SendMessage send = new SendMessage();
			    		send.execute(getTag().toString(), textOfMessage.getText().toString());
			    	}
			    	break;
			    default:
				      break;
				    }
				}
		
		 
		@Override
		public void onDestroyView() {
			 Log.i(LOG_TAG, "onDestroy");
			 
		//lm.destroyLoader(this.getTag().toString().hashCode()) ;
		//setListAdapter(null);
		super.onDestroy();
		}
		
}
Пока есть версия что это из-за закоменченного setListShown(), но пока как неполучается сделать что-бы программа с этим методом взлетела.. вроде на http://stackoverflow.com/ есть несколько похожих проблем но как их прикрутить к моему случаю пока не соображу

ivied
Сообщения: 15
Зарегистрирован: 08 мар 2013, 03:04

Re: Как правильно перезаполнить tab? LoaderManager..

Сообщение ivied » 11 апр 2013, 01:55

после магических танцев с бубнами и внедрения кода из http://stackoverflow.com/questions/1286 ... ustom-view совета метод setListShown взлетел. но tab по прежнему не отображается после второго клика

Ответить