问题描述
我有两个片段
,片段A
和片段B
。 片段A
列出所有的产品和片段B
显示详细询问产品及其形象。
I've a two fragments
, Fragment A
and Fragment B
. Fragment A
lists all products and Fragment B
shows detail about the product and its images.
片段A
电话片段B
和片段B
从获取Web服务和数据集以 ViewPager
使用适配器
。最初,它会显示正确的图像,但此后它总是有相同的图像。
Fragment A
calls Fragment B
and Fragment B
fetches data from web service and sets to ViewPager
using Adapter
. Initially it displays correct image but thereafter it always have the same image.
如果我们火 adapter.notifyDataSetChanged()
从片段B的任何点击事件,然后它的作品完美,但我们必须要尽快显示为片段B是可见的。
If we fire adapter.notifyDataSetChanged()
from any click event in Fragment B then it works perfectly but we have to display as soon as Fragment B is visible
请看看code。
public class ImageAdapter extends FragmentStatePagerAdapter {
private List<String> pImageURL;
public ImageAdapter(FragmentManager fm, List<String> imageURL) {
super(fm);
// TODO Auto-generated constructor stub
pImageURL = imageURL;
Utility.showLog("PagerAdapter URL", pImageURL.toString());
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
String imageURL = pImageURL.get(position);
PImageFragment imageFragment = (PImageFragment) PImageFragment.getInstance();
imageFragment.setProductImage(imageURL);
return imageFragment;
}
@Override
public int getItemPosition(Object object) {
PImageFragment pFragment = (PImageFragment) object;
String URL = pFragment.getProductImage();
int position = pImageURL.indexOf(URL);
if (position>=0)
URL = pImageURL.get(position);
if (position>=0)
return position;
else
return POSITION_NONE;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return pImageURL.size();
}
}
片段B
// Image Loading Process
String p_images = model.getProdutImageURL();
imageUrl = new ArrayList<String>();
if (p_images.contains(","))
imageUrl.addAll(Arrays.asList(p_images.split(",")));
else
imageUrl.add(p_images);
mAdapter = new ImageAdapter(getChildFragmentManager(), imageUrl);
vPager.setPageTransformer(true, new DepthPageTransformer());
vPager.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
PImage片段
public class PImageFragment extends Fragment {
private static final String TAG = "Product_Images_Fragment";
private View rootView;
private ImageView ivProductImage;
private String imageURL;
@Override
@Nullable
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
rootView = inflater.inflate(R.layout.p_detail_images, container, false);
bindComponents(rootView);
loadImages(imageURL);
return rootView;
}
public static Fragment getInstance() {
Fragment fragment = new PImageFragment();
return fragment;
}
public void setProductImage(String image_url) {
imageURL = image_url;
Utility.showLog(TAG + "Received URL : ", imageURL.toString());
}
public String getProductImage() {
return imageURL;
}
private void bindComponents(View v) {
// TODO Auto-generated method stub
ivProductImage = (ImageView) v.findViewById(R.id.ivProductImage);
}
private void loadImages(String image_url) {
Utility.showLog(TAG,
"http://baryapp.com/kickzexchange/assets/products/" + image_url);
final ProgressBar pBar = (ProgressBar) rootView
.findViewById(R.id.pBarLoader);
pBar.setVisibility(View.VISIBLE);
ImageLoader imgLoader = VolleySingleton.getInstance().getImageLoader();
imgLoader.get("http://baryapp.com/kickzexchange/assets/products/"
+ image_url, new ImageListener() {
@Override
public void onErrorResponse(VolleyError vError) {
// TODO Auto-generated method stub
Utility.showLog(TAG, vError.getLocalizedMessage() + "");
}
@Override
public void onResponse(ImageContainer response, boolean result) {
// TODO Auto-generated method stub
if (response.getBitmap() != null) {
ivProductImage.setImageBitmap(response.getBitmap());
pBar.setVisibility(View.GONE);
}
}
});
}
}
更新
// This is how fragment A calls fragment B
ProductDetail pDetail = new ProductDetail();
Bundle bundle = new Bundle();
bundle.putString("product_id", productList.get(position).getProductID());
bundle.putString("product_title", productList.get(position).getProductTitle());
pDetail.setArguments(bundle);
((MyTabActivity) mActivity).navigateFragment(Utility.BUY_TAB, pDetail,
true);
最新更新
public void navigateFragment(String tag, Fragment fragment,
boolean shouldAdd) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
if (shouldAdd)
mStacks.get(tag).push(fragment); // push fragment on stack
if (mCurrentFragment != null) {
saveFragmentState(mCurrentFragment.getClass().getName(), mCurrentFragment);
}
mCurrentFragment = fragment;
restoreFragmentState(fragment.getClass().getName(), fragment);
ft.replace(android.R.id.tabcontent, fragment);
ft.commit();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
Bundle fragmentStates = new Bundle(mFragmentStates.size());
for (Map.Entry<String, Fragment.SavedState> entry : mFragmentStates.entrySet()) {
fragmentStates.putParcelable(entry.getKey(), entry.getValue());
}
outState.putParcelable(KEY_FRAGMENT_STATES, fragmentStates);
}
private void saveFragmentState(String id, Fragment fragment) {
Fragment.SavedState fragmentState =
getSupportFragmentManager().saveFragmentInstanceState(fragment);
mFragmentStates.put(id, fragmentState);
}
private void restoreFragmentState(String id, Fragment fragment) {
Fragment.SavedState fragmentState = mFragmentStates.remove(id);
if (fragmentState != null) {
if (!fragment.isAdded())
fragment.setInitialSavedState(fragmentState);
}
}
任何帮助/想法是非常AP preciated。
Any help/idea is highly appreciated.
推荐答案
最后,我已经解决了答案。 片段B
天渐渐保存在 navigateFragment
,它已经由下面一行pvented $ P $和它的工作。
Finally I've solved the answer. Fragment B
was getting saved in navigateFragment
, it has been prevented by the following line and it worked.
if (mCurrentFragment != null) {
if (mCurrentFragment instanceof GetProducts)
saveFragmentState(mCurrentFragment.getClass().getName(), mCurrentFragment);
}
这篇关于ViewPager没有得到使用FragmentStatePagerAdapter更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!