我正在尝试使用滑动来设置标签标题条,以便在文档here.中演示的片段之间进行切换。它可以工作,直到某一点。 gridview显示所需的所有图像,但是片段1和片段2都显示相同的图像。片段2似乎覆盖了图像,因为如果单击片段1中的图像,则会弹出片段1详细信息屏幕(即使它显示片段2中的图像)。
基本上,我需要我的ImageAdapter(BaseAdapter)来显示每个单独片段的正确图像。如果没有静态元素,我不会看到第二个片段如何与第一个片段进行交互。
编辑:我尝试更改为Picasso并发生了同样的错误,因此我的代码中必须包含某些内容。
Edit2:我发现了这个answer,它确实让我在片段变得可见时重绘网格,但这会导致明显的闪烁,很明显图像是错误的。问题必须在于UIL / Picasso认为单独片段中的gridview是同一个对象(它们具有相同的图像,但顺序不同)。
public void setupFragmentSwipes() {
mDemoCollectionPagerAdapter =
new DemoCollectionPagerAdapter(
getFragmentManager());
mViewPager = (ViewPager) mRootView.findViewById(R.id.pager);
mViewPager.setAdapter(mDemoCollectionPagerAdapter);
}
public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
String[] array = getResources().getStringArray(R.array.SortOptions);
public DemoCollectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment = new FragmentGrid();
Bundle args = new Bundle();
args.putInt("mMode", mMode);
args.putInt("mSortAorD", mSortAorD);
args.putInt("mSortType", i);
fragment.setArguments(args);
return fragment
}
@Override
public int getCount() {
return array.length;
}
@Override
public CharSequence getPageTitle(int position) {
return array[position];
}
}
FragmentGrid
public class FragmentGrid extends Fragment {
public int mode;
private ArrayList<Theme> mThemes;
private GridView listView;
private static DisplayImageOptions options;
protected ImageLoader imageLoader = ImageLoader.getInstance();
protected int mSavedPosition;
private int sortType;
private int sortAorD;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
// The last two arguments ensure LayoutParams are inflated
// properly.
View rootView = inflater.inflate(
R.layout.fragment_collection_object, container, false);
Bundle args = getArguments();
mode = args.getInt("mMode", BaseConstants.ViewModes.NORMAL);
sortType = args.getInt("mSortType", BaseConstants.Sort.POPULAR);
sortAorD = args.getInt("mSortAorD", BaseConstants.Sort.DESC);
listView = (GridView) rootView.findViewById(R.id.gridview2);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_error)
.showImageOnFail(R.drawable.ic_error)
.cacheOnDisc(true)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
return rootView;
}
@Override
public void onResume() {
super.onResume();
listView.setSelection(mSavedPosition);
ThemeManager tm = new ThemeManager(getActivity().getApplicationContext());
mThemes = tm.getModifiedThemeList(mode);
mThemes = tm.compare(sortType, sortAorD, checkIfTesting());
listView.setAdapter(new ImageAdapter(mThemes));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSavedPosition = position;
Intent intent = new Intent(getActivity(), ImagePagerActivity.class);
intent.putExtra("mMode", mode);
intent.putExtra("mSortAorD", sortAorD);
intent.putExtra("mSortType", sortType);
intent.putExtra("mPosition", position);
startActivity(intent);
}
});
}
public class ImageAdapter extends BaseAdapter {
ArrayList<Theme> imageAdapterThemeList;
public ImageAdapter(ArrayList<Theme> themes) {
imageAdapterThemeList = themes;
}
@Override
public int getCount() {
int result = 0;
if (imageAdapterThemeList != null) {
result = imageAdapterThemeList.size();
}
return result;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = (ImageView) getActivity().getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
} else {
imageView = (ImageView) convertView;
}
Theme theme = imageAdapterThemeList.get(position);
imageLoader.displayImage(theme.getImageURL(), imageView, options);
return imageView;
}
}
fragment_collection_object.xml
<GridView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:horizontalSpacing="4dip"
android:numColumns="auto_fit"
android:columnWidth="150dip"
android:scrollbars="vertical"
android:stretchMode="columnWidth"
android:verticalSpacing="4dip"
android:padding="4dip" />
答案 0 :(得分:1)
两个片段实例之间的唯一区别是,您的参数mSortType
中的Bundle
根据页面设置为0
或1
。您只能使用它来设置mThemes
,而您似乎从未在ImageAdapter
中使用它。
因此,如果您希望两个ImageAdapter
个实例返回单独的结果,则需要注意mSortType
或者根据页面的不同而不同。
答案 1 :(得分:0)
我遇到的问题听起来与此前非常相似。事实证明,它是交换页面时使用的动画,与寻呼机或适配器完全无关。基本上动画导致fragment1位于fragment2的顶部但完全透明,因此用户认为他们正在触摸fragment2,但是事件是由fragment1接收的...这使得它的行为非常像适配器返回错误的片段。
简而言之,如果您正在使用动画(特别是z顺序更改动画),请尝试禁用它们并查看问题是否消失。如果是这样,您的动画就会出现问题。
希望有所帮助, 祝你好运。
答案 2 :(得分:0)
好的,我找到了答案,但我不知道为什么。我不得不改变以下内容:
ArrayList<Theme> imageAdapterThemeList;
public ImageAdapter(ArrayList<Theme> themes) {
imageAdapterThemeList = themes;
}
为:
ArrayList<Theme> imageAdapterThemeList = new ArrayList<Theme>();
public ImageAdapter(ArrayList<Theme> themes) {
for (int i = 0; i< themes.size() ;i++) {
imageAdapterThemeList.add(i, themes.get(i));
}
}
我认为,而不是创建一个新的ArrayList,我只是指向旧的。这种新方法实际上重新创建了它,但我确信它不是很有效。