0

с использованием PagerSlidingTabStrip для визуализации фрагмента в закладкахCursor загрузчик не работает после того, как фрагмент отсоединяется

@Override 
     public Fragment getItem(int position) { 

      if (position == 0) 
       return new FlipActivity(); 
      else if (position == 1) 
       return new CategoryFragment(); 
      else if (position == 2) 
       return new PeopleTabFragment(); 
      else if (position == 3) 
       return new MessageTabFragment(); 
      else if (position == 4) 
       return new HistorytabFragment(); 
      return new SuperAwesomeCardFragment().newInstance(position); 

     } 

PeopleTabFragment использует адаптер курсора для чтения контактов из телефона и дисплея. Проблема в том, что это работает только в первый раз. Когда я выберу другие вкладки и вернусь, чтобы снова выбрать вкладку «Люди», список будет пустым. Сниппет находится ниже.

public class PeopleTabFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 
PeopleAdapter peopleAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.contact_layout, container, false); 
    StickyListHeadersListView listView = (StickyListHeadersListView) rootView.findViewById(R.id.list); 
    getActivity().getSupportLoaderManager().initLoader(0, savedInstanceState, this); 
    peopleAdapter = new PeopleAdapter(getActivity(), null, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 
    listView.setAdapter(peopleAdapter); 

    return rootView; 
} 

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    CursorLoader cursorLoader = new CursorLoader(getActivity(), ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, "upper(" + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + ") ASC"); 
    return cursorLoader; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    peopleAdapter.load(data); 
    peopleAdapter.swapCursor(data); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    peopleAdapter.swapCursor(null); 
} 
} 

и это адаптера

public class PeopleAdapter extends CursorAdapter implements StickyListHeadersAdapter { 

ArrayList checkerList = new ArrayList(); 
LayoutInflater mLayoutInflater; 

public PeopleAdapter(Context context, Cursor c, int flags) { 
    super(context, c, flags); 

    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 


public void load(Cursor c) { 
    while (c.moveToNext()) { 
     String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     checkerList.add(name); 
    } 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return mLayoutInflater.inflate(R.layout.people_item, parent, false); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
    TextView nameTextView = (TextView) view.findViewById(R.id.name); 
    ImageView imageView = (ImageView) view.findViewById(R.id.contactImage); 
    String uri = cursor.getString(cursor 
      .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); 
    try { 
     imageView.setImageURI(Uri.parse(uri)); 
    } catch (Exception e) { 
     imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_launcher)); 
    } 
    nameTextView.setText(name); 
} 

@Override 
public View getHeaderView(int position, View convertView, ViewGroup viewGroup) { 
    FunctionHolder holder; 
    if (convertView == null) { 
     holder = new FunctionHolder(); 
     convertView = mLayoutInflater.inflate(R.layout.people_header, viewGroup, false); 
     holder.functionButton = (TextView) convertView.findViewById(R.id.text); 
     convertView.setTag(holder); 
    } else { 
     holder = (FunctionHolder) convertView.getTag(); 
    } 
    //set people_header text as first char in name 
    String headerText = "" + checkerList.get(position).toString().subSequence(0, 1).charAt(0); 
    holder.functionButton.setText(headerText); 
    return convertView; 
} 

@Override 
public long getHeaderId(int position) { 
    return checkerList.get(position).toString().subSequence(0, 1).charAt(0); 
} 

ответ

0

Не совсем уверен, но пожалуйста, вы можете попытаться уничтожить ваш загрузчик в onLoadFinished() с помощью

getActivity().getSupportLoaderManager().destroyLoader(int id); 

Это 'INT ID' является целочисленное значение, которое вы передаете в 'initLoader'. Для удобства чтения используйте некоторое значение, превышающее 0.