Как правильно перезаполнить tab? LoaderManager..
Как правильно перезаполнить tab? LoaderManager..
Всем привет. Есть 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ы
Re: Как правильно перезаполнить tab? LoaderManager..
ivied
Код в студию, а то так, мы понять не можем, что не так.
Код в студию, а то так, мы понять не можем, что не так.
Re: Как правильно перезаполнить tab? LoaderManager..
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();
}
}Re: Как правильно перезаполнить tab? LoaderManager..
после магических танцев с бубнами и внедрения кода из http://stackoverflow.com/questions/1286 ... ustom-view совета метод setListShown взлетел. но tab по прежнему не отображается после второго клика