gpt4 book ai didi

android - ViewPager 未使用 FragmentStatePagerAdapter 更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:03:47 25 4
gpt4 key购买 nike

我有两个 fragment fragment A fragment B fragment A 列出所有产品, fragment B 显示有关产品及其图像的详细信息。

Fragment A 调用 Fragment B 并且 Fragment B 从 Web 服务获取数据并设置为 ViewPager 使用 适配器。最初它显示正确的图像,但此后它始终显示相同的图像。

如果我们从 Fragment B 中的任何点击事件触发 adapter.notifyDataSetChanged() 那么它会完美地工作,但我们必须在 Fragment B 可见时立即显示

请看代码。

 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();
}
}

fragment 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();

P图像 fragment

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);

}

}

非常感谢任何帮助/想法。

最佳答案

您可以为 fragment 使用以下 PagerFragment 基类,并根据需要实现 onVisible 方法:

public abstract class PagerFragment extends Fragment {

private boolean mCalled = false;
private boolean mWasVisible = false;
private boolean mIsResumed = false;
private boolean mIsPaused = false;

protected void onVisible() {
mCalled = true;
}

protected void onHide() {
mCalled = true;
}

/**
* {@inheritDoc}
*
* @see android.app.Fragment#onAttach(android.app.Activity)
*/
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}

/**
* {@inheritDoc}
*
* @see android.app.Fragment#onDetach()
*/
@Override
public void onDetach() {
super.onDetach();
}

/**
* {@inheritDoc}
*
* @see android.app.Fragment#onResume()
*/
@Override
public void onResume() {
super.onResume();
mIsPaused = false;
mIsResumed = true;
setUserVisibleHint(getUserVisibleHint());
}

/**
* {@inheritDoc}
*
* @see android.app.Fragment#onPause()
*/
@Override
public void onPause() {
mIsPaused = true;
mIsResumed = false;
setUserVisibleHint(getUserVisibleHint());
super.onPause();
}

/**
* {@inheritDoc}
*
* @see android.app.Fragment#setUserVisibleHint(boolean)
*/
@Override
public void setUserVisibleHint(boolean visible) {
super.setUserVisibleHint(visible);

mCalled = false;
if (mIsResumed) {
if (visible) {
performVisible();
mWasVisible = visible;
} else {
performHide();
mWasVisible = visible;
}
} else if (mIsPaused && mWasVisible) {
performHide();
mWasVisible = visible;
}

}

private void performVisible() {
onVisible();
if (!mCalled) {
throw new SuperNotCalledException("PagerFragment " + this + " did not call through to super.onVisible()");
}
}

private void performHide() {
onHide();
if (!mCalled) {
throw new SuperNotCalledException("PagerFragment " + this + " did not call through to super.onHide()");
}
}

}

或者您只需在 Fragment A 上预加载数据并在加载数据时通知适配器,然后更改页面。始终可以从 ViewPager 动态添加和删除 Fragment。因此,您也可以尝试删除包含旧数据的 fragment ,然后再创建一个新 fragment 。

关于android - ViewPager 未使用 FragmentStatePagerAdapter 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32129247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com