私はネイティブのアンドロイド開発をしています。私は3つのタブ(マップ、カメラ、画像)があります。 Map
は現在のGPS位置を地図上にマーカーで表示しています。 Camera
は写真を撮影するために使用され、Pictures
は、カメラから撮影した画像を保存するためのグリッドビューを持っています。私は(2つ目のタブで)カメラから写真を撮った後、第三のタブに行くときAndroidタブの変更/スワイプで画像グリッドビューのアダプタをリフレッシュする方法は?
以下
のような画面の外観は、今すぐ画像がありませんが、私はアプリを閉じて、その後に行くとき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
タブに行く私は私の画像が表示されません。私はまだ同じ問題に直面しています。
また、私は自分のコードをデバッグしましたが、それはupdate
とgetItemPostion
の方法には決して行きません。
私はそれに固執しており、本当にそれを行う方法の手がかりを持っていません。 すべてのヘルプは非常に
あなたの 'ViewPager'では、あなたがピクチャを入力するときに' ViewPager.OnPageChangeListener'を追加し、 'adapter.notifyDataSetChanged()'を呼び出します。 onCreateViewは一度だけ呼び出されるので、アプリケーションを再起動するとき以外は更新されません。 –
FragmentPagerAdapterのコードを投稿できますか? –
@AhmedAbidi私は 'viewpager'を使用していません。 @ ValentinoS。 – faisal1208