2017-02-02 3 views
0

Я новичок в разработке Android. У меня есть 3 вкладки (Карта, Камера, Картинки). Map показывает текущее местоположение gps с маркером на карте. Camera используется для фотосъемки, а Pictures имеет сетку, чтобы отображать сохраненные снимки, снятые с камеры. Экран выглядеть нижеAndroid, как обновить адаптер сетки изображения на вкладке, измените/проведите пальцем по экрану?

enter image description here

Теперь, когда я беру картинку с камеры (во второй вкладке), а затем перейдите на вкладку 3 картина не существует, но когда я закрыть приложение, а затем перейти к на вкладке pictures показано изображение. Я хочу обновить image adapter при прокрутке на вкладку picture. Для этого я искал много статей и обнаружил, что для этой цели используется notifyDataSetChanged(), поэтому я попытался реализовать его на своем классе picture, но он не обновляет его.

Ниже мой адаптер код

public class GridViewImageAdapter extends BaseAdapter { 

private Activity _activity; 
private ArrayList<String> _filePaths = new ArrayList<String>(); 
private int imageWidth; 

public GridViewImageAdapter(Activity activity, ArrayList<String> filePaths, 
          int imageWidth) { 
    this._activity = activity; 
    this._filePaths = filePaths; 
    this.imageWidth = imageWidth; 
} 

@Override 
public int getCount() { 
    return this._filePaths.size(); 
} 

@Override 
public Object getItem(int position) { 
    return this._filePaths.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     imageView = new ImageView(_activity); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    // get screen dimensions 
    Bitmap image = decodeFile(_filePaths.get(position), imageWidth, 
      imageWidth); 

    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, 
      imageWidth)); 
    imageView.setImageBitmap(image); 

    // image view click listener 
    imageView.setOnClickListener(new OnImageClickListener(position)); 

    return imageView; 
} 

class OnImageClickListener implements OnClickListener { 

    int _postion; 

    // constructor 
    public OnImageClickListener(int position) { 
     this._postion = position; 
    } 

    @Override 
    public void onClick(View v) { 
     // on selecting grid view image 
     // launch full screen activity 
     /*Intent i = new Intent(_activity, FullScreenViewActivity.class); 
     i.putExtra("position", _postion); 
     _activity.startActivity(i);*/ 
    } 

} 

/* 
* Resizing image size 
*/ 
public static Bitmap decodeFile(String filePath, int WIDTH, int HIGHT) { 
    try { 

     File f = new File(filePath); 

     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

     final int REQUIRED_WIDTH = WIDTH; 
     final int REQUIRED_HIGHT = HIGHT; 
     int scale = 1; 
     while (o.outWidth/scale/2 >= REQUIRED_WIDTH 
       && o.outHeight/scale/2 >= REQUIRED_HIGHT) 
      scale *= 2; 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return null; 
}} 

Ниже мой код picture

public class Pictures extends Fragment { 

private Utils utils; 
private ArrayList<String> imagePaths = new ArrayList<String>(); 
private GridViewImageAdapter adapter; 
private GridView gridView; 
private int columnWidth; 


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

    gridView = (GridView) rootView.findViewById(R.id.grid_view); 
    utils = new Utils(getContext()); 

    // Initilizing Grid View 
    InitilizeGridLayout(); 

    // loading all image paths from SD card 
    imagePaths = utils.getFilePaths(); 

    // Gridview adapter 

    adapter = new GridViewImageAdapter(getActivity(), imagePaths, columnWidth); 
    /*adapter = new GridViewImageAdapter(Pictures.this, imagePaths, 
      columnWidth);*/ 

    // setting grid view adapter 
    gridView.setAdapter(adapter); 

    // called the method here 
    adapter.notifyDataSetChanged(); 


    return rootView; 
} 

private void InitilizeGridLayout() { 

    Resources r = getResources(); 
    float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
      AppConstant.GRID_PADDING, r.getDisplayMetrics()); 

    columnWidth = (int) ((utils.getScreenWidth() - ((AppConstant.NUM_OF_COLUMNS + 1) * padding))/AppConstant.NUM_OF_COLUMNS); 

    gridView.setNumColumns(AppConstant.NUM_OF_COLUMNS); 
    gridView.setColumnWidth(columnWidth); 
    gridView.setStretchMode(GridView.NO_STRETCH); 
    gridView.setPadding((int) padding, (int) padding, (int) padding, 
      (int) padding); 
    gridView.setHorizontalSpacing((int) padding); 
    gridView.setVerticalSpacing((int) padding); 
}} 

Update 1

Ниже мой код FragmentPagerAdapter, который находится в моей MainActivity

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       MyLocation loc = new MyLocation(); 
       return loc; 
      case 1: 
       Camera cam= new Camera(); 
       return cam; 
      case 2: 
       Pictures pic = new Pictures(); 
       return pic; 

      default: 
       return null; 
     } 

    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return "MyLocation"; 
      case 1: 
       return "Camera"; 
      case 2: 
       return "Pictures"; 
     } 
     return null; 
    } 
} 

Update 2

я следовал предложение Valentino S., но все еще не в состоянии увидеть захват изображения с камеры во второй вкладке.

Ниже обновленный код

** MainActivity.java **

public class MainActivity extends AppCompatActivity { 
    ........ 
      public interface Updateable 
      { 
       public void update(); 
      } 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getItemPosition(Object object) 
    { 
     if(object != null && object instanceof Pictures) 
     { 
      Pictures p = (Pictures) object; 
      p.update(); 
     } 
     return super.getItemPosition(object); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       MyLocation loc = new MyLocation(); 
       return loc; 
      case 1: 
       Camera cam= new Camera(); 
       return cam; 
      case 2: 
       Pictures pic = new Pictures(); 
       return pic; 

      default: 
       return null; 
     } 

    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return "MyLocation"; 
      case 1: 
       return "Camera"; 
      case 2: 
       return "Pictures"; 
     } 
     return null; 
    }// end charsequence 

    }// end SectionsPagerAdapter 

}// end mainactivity 

Pictures.java

public class Pictures extends Fragment implements MainActivity.Updateable { 
........ 
@Override 
public void update() { 
    if(adapter !=null) 
    { 
     adapter.notifyDataSetChanged(); 

    } 
    else 
    { 
     Log.d(getTag(),"null"); 
    } 
    } 
....... 
} 

Так что, когда я запустить приложение, сделать снимок из камера, а затем перейдите на вкладку Pictures, и я не увижу свою фотографию. Я все еще сталкиваюсь с той же проблемой.

Кроме того, я отлаживал свой код, он никогда не подходит к методу update и getItemPostion, и это меня больше всего волнует.

Я придерживаюсь этого и действительно не имею понятия, как это сделать. Любая помощь будет высоко оценен

+0

В вашем представлении ViewPager добавьте 'ViewPager.OnPageChangeListener' и вызовите' adapter.notifyDataSetChanged() 'при вводе изображений. onCreateView вызывается только один раз, поэтому он не обновляется, кроме случаев, когда вы перезапускаете приложение. –

+0

Можете ли вы опубликовать код вашего FragmentPagerAdapter (предположим, вы его используете)? –

+0

@AhmedAbidi Я не использую 'viewpager'. – faisal1208

ответ

2

Хорошо, вы можете попробовать таким образом:

В вашем MainActivity добавить этот интерфейс:

public interface Updateable { 
    public void update(); 
} 

Теперь реализовать этот интерфейс в вашем фрагменте и написать код уведомить адаптер внутри update метода:

public class Pictures extends Fragment implements MainActivity.Updateable { 
    ... 
    @Override 
    public void update() { 
     if (adapter != null) { 
      adapter.notifyDataSetChanged(); 
     } else { 
      Log.d(LOG_TAG, "null"); 
     } 
    } 
    ... 
} 

Что остается сделать, это позвонить в update из основной операции, когда первый фрагмент загружается. Вы можете сделать это только Onverriding метод getItemPosition в вашем SectionPagerAdapter, как это:

@Override 
public int getItemPosition(Object object) {  
    if (object != null && object instanceof Pictures) { 
     Pictures f = (Pictures) object; 

     f.update(); 
    } 
    return super.getItemPosition(object); 
} 

Чтобы иметь работу, в конце концов, вы должны вызвать notifyDataSetChanged() вашего адаптера ViewPager. Это заставит адаптер вашего viewpager вызвать метод getItemPosition.

Надеюсь, что это сработает!

Update 1

Другой подход, который я могу думать, чтобы переопределить метод getItemPosition следующим образом:

@Override 
public int getItemPosition(Object object) {  
    return POSITION_NONE;  
} 

А потом, когда в вашем MainActivity вы звоните viewPagerAdapter.notifyDataSetChanged(), вид пейджера будет удалите все виды и перезагрузите их. Возможно, вы можете попытаться назвать это, когда ваше изображение сохранено, или таким образом:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     int previousState; 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

      if (previousState == ViewPager.SCROLL_STATE_SETTLING && state == ViewPager.SCROLL_STATE_IDLE) { 

       if (viewPagerAdapter.getItem(viewpager.getCurrentItem()) instanceof Pictures) { 
        Log.d(LOG_TAG, "New Position=" + viewpager.getCurrentItem()); 

        viewPagerAdapter.notifyDataSetChanged(); 
       } 

      } 
      previousState = state; 
     } 
    }); 

Надеюсь, что это сработает!

+1

Извините, что я был в отставке в то время, попробовал свой метод и ответим вам назад :) – faisal1208

+0

Хорошо, я предлагаю вам отладить (регистрировать) поток кода, чтобы попытаться понять, где он не работает ... попробуйте прокомментировать все строки внутри метода getItemPosition и добавьте только следующее (внутри этого метода): return POSITION_NONE; –

+0

Также я предлагаю опубликовать код фрагмента вашей камеры –

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