2017-02-02 3 views
0

私はネイティブのアンドロイド開発をしています。私は3つのタブ(マップ、カメラ、画像)があります。 Mapは現在のGPS位置を地図上にマーカーで表示しています。 Cameraは写真を撮影するために使用され、Picturesは、カメラから撮影した画像を保存するためのグリッドビューを持っています。私は(2つ目のタブで)カメラから写真を撮った後、第三のタブに行くときenter image description hereAndroidタブの変更/スワイプで画像グリッドビューのアダプタをリフレッシュする方法は?

以下

のような画面の外観は、今すぐ画像がありませんが、私はアプリを閉じて、その後に行くときpicturesタブに画像が表示されます。 pictureタブにスワイプすると、image adapterが更新されます。このため私は多くの記事を検索し、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); 
}} 

アップデート1

のための私のコードは私のMainActivity

である FragmentPagerAdapterための私のコードであるです
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; 
    } 
} 

アップデート2

私はValentino S.の提案に従ったが、まだ2つ目のタブでカメラからの画像キャプチャを表示することができませんでしてきました。

以下

は私がアプリを実行するときに、から写真を撮って更新されたコード

** 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タブに行く私は私の画像が表示されません。私はまだ同じ問題に直面しています。

また、私は自分のコードをデバッグしましたが、それはupdategetItemPostionの方法には決して行きません。

私はそれに固執しており、本当にそれを行う方法の手がかりを持っていません。 すべてのヘルプは非常に

+0

あなたの 'ViewPager'では、あなたがピクチャを入力するときに' ViewPager.OnPageChangeListener'を追加し、 'adapter.notifyDataSetChanged()'を呼び出します。 onCreateViewは一度だけ呼び出されるので、アプリケーションを再起動するとき以外は更新されません。 –

+0

FragmentPagerAdapterのコードを投稿できますか? –

+0

@AhmedAbidi私は 'viewpager'を使用していません。 @ ValentinoS。 – faisal1208

答えて

2

[OK]をいただければ幸い、あなたはこのような方法で試すことができます。

あなたMainActivityでは、このインタフェースを追加します、今

public interface Updateable { 
    public void 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メソッドの内部アダプタを通知しますフラグメントが最初にロードされたときのメインアクティビティからのメソッドです()。あなたはこのように、ちょうどあなたのSectionPagerAdaptergetItemPosition方法をOnverridingこれを行うことができます。作業が行われていために

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

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

、最終的に、あなたはあなたのviewPagerアダプタのnotifyDataSetChanged()を呼び出す必要があります。これにより、ビューページのアダプタがgetItemPositionメソッドを呼び出すようになります。

希望の作品です!その後、

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

そして、あなたのMainActivityにあなたがviewPagerAdapter.notifyDataSetChanged()を呼び出し、ビューのページャます:

アップデート1

私が考えることができる別のアプローチは、このようにgetItemPositionメソッドをオーバーライドすることですすべてのビューを削除して再ロードしてください。画像を保存するときや、次のようにこの呼び出しを試みることができます:

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

OK、私はあなたが失敗した場所を理解しようとするコードの流れをデバッグ(ロギング)することをお勧めしますgetItemPositionメソッド内のすべての行にコメントを付け、次のものだけをこのメソッド内に追加してください。return POSITION_NONE; –

+0

また、カメラフラグメントのコードを投稿することをお勧めします。 –

関連する問題