2012-06-06 4 views
0

У меня есть три вкладки, карта, галерея изображений и тег настроек. Я попытался настроить их с помощью фрагментов, и они работают по большей части. Чтобы получить вкладку карты, я следил за вещами этого парня MapView in a Fragment (Honeycomb).GridView в TabHost Фрагмент исчезает после переключения табуляции

Вкладка «Настройки» использует ListFragment и отлично работает, как и карта. На вкладке изображения у меня есть работы в первый раз. Я перехожу к нему, и все изображения загружаются правильно, но если я переключусь на одну из других вкладок и вернусь на вкладку изображений, все исчезнет, ​​и ничего не загрузится. Вкладка изображения загрузится правильно, если я вернусь из приложения и снова открою его, что заставляет меня думать, что что-то загружается правильно, но не переинициализируется или что-то, когда я перехожу к этой вкладке.

Галерея изображений Код:

public class ImageGridFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 

ImageAdapter imageAdapter; 
GalleryItem[] galleryItems = new GalleryItem[0]; 
GridView gridView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
    getActivity().getSupportLoaderManager().initLoader(0, null, this); 
    imageAdapter = new ImageAdapter(getActivity(), galleryItems); 
} 

@Override 
public View onCreateView(
     LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View v = inflater.inflate(R.layout.image_grid_fragment, container, false); 
    gridView = (GridView) v.findViewById(R.id.gridView); 
    Gallery.setContentResolver(getActivity().getContentResolver()); 
    Gallery.setDefaultBitmap(getResources(), R.drawable.loading); 
    gridView.setOnItemClickListener(new GridView.OnItemClickListener() { 
     public void onItemClick(AdapterView parent, View v, final int position, long id) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
      final LayoutInflater 
        inflater = (LayoutInflater) getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.image_popup, null); 
      ImageView image = (ImageView) view.findViewById(R.id.image); 
      Drawable d = Drawable.createFromPath(galleryItems[position].getUri().getPath()); 
      image.setImageDrawable(d); 
      image.setMinimumHeight(d.getMinimumHeight());// (int) (d.getIntrinsicHeight() * 2.5)); 
      image.setMinimumWidth(d.getIntrinsicWidth());// (int) (d.getIntrinsicWidth() * 2.5)); 
      builder.setPositiveButton("Send", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 
        Intent sendIntent = new Intent(getActivity(), RecordSomething.class); 
        sendIntent.putExtra("FILE", new File(galleryItems[position].getUri().getPath())); 
        startActivityForResult(sendIntent, Constants.ACTIVITY_SEND_PHOTO); 
       } 
      }); 
      builder.setNegativeButton("Cancel", null); 
      builder.setView(view); 
      builder.show(); 
     } 
    }); 
    return v; 
} 

/* Creates the menu items */ 
@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.gallery_menu, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

/* Handles item selections */ 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu_camera: 
      Intent camIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

      /* 
      * The below code was used to send a parameter to the native camera app to tell it 
      * to save a copy of the image taken to the file we specified. This worked fine, 
      * except that the image lost it's orientation. What we do instead is in onActivityResult 
      * we find the most recent image taken, move it to our folder, rename it, and resize it 
      */ 

      startActivityForResult(camIntent, Constants.ACTIVITY_TAKE_PHOTO); 
      return true; 
    } 
    return false; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case Constants.ACTIVITY_TAKE_PHOTO: 
      if (resultCode == Activity.RESULT_OK) { 
       Intent sendIntent = new Intent(getActivity(), RecordSomething.class); 
       sendIntent.putExtra("FILE", "test"); //TODO get the path from the array of pictures 
       startActivityForResult(sendIntent, Constants.ACTIVITY_SEND_PHOTO); 
      } 
      break; 
    } 
} 

@Override 
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
    return new CursorLoader(getActivity(), 
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new String[]{ 
        MediaStore.Images.ImageColumns._ID, 
        MediaStore.Images.ImageColumns.ORIENTATION, 
        MediaStore.Images.Media.DATA 
      }, 
      MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME + " = 'Camera'", 
      null, 
      MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
    galleryItems = new GalleryItem[cursor.getCount()]; 

    cursor.moveToFirst(); 
    if (cursor.moveToFirst()) { 
     int i = 0; 
     do { 
      galleryItems[i] = new GalleryItem(
        cursor.getInt(cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID)), 
        cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)), 
        cursor.getInt(cursor.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION))); 
      i++; 
     } while (cursor.moveToNext()); 
    } 

    imageAdapter.setGalleryItems(galleryItems); 
    gridView.setAdapter(imageAdapter); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> cursorLoader) {} 
} 

любая помощь, высоко ценится

ответ

0

В случае, если кто-то любопытно, я решил. Проблема в том, что я не вызывал gridView.setAdapter в onCreateView. Причина, по которой все работало в первый раз, состояла в том, что именно тогда, когда курсор был загружен, он был вызван в onLoadFinished, как вы можете видеть выше.

Мне нужно было поместить его onCreateView, потому что мой gridview переопределяется там каждый раз, поэтому, если я не вызываю setAdapter и курсор уже загружен. Изображения не начинают заполняться.

+0

notifydatasetchanged works также – Josh

Смежные вопросы