【问题标题】:FragmentPagerAdapter + BaseAdapter + UIL not UpdatingFragmentPagerAdapter + BaseAdapter + UIL 未更新
【发布时间】:2014-07-05 19:47:29
【问题描述】:

我正在尝试设置一个选项卡标题条,使用滑动来在文档here. 中演示的片段之间切换它可以工作,直到某一点。网格视图根据需要显示所有图像,但是片段 1 和片段 2 都显示相同的图像。似乎片段 2 正在覆盖图像,因为如果您单击片段 1 中的图像,会弹出片段 1 详细信息屏幕(即使它显示来自片段 2 的图像)。

基本上,我需要我的 ImageAdapter (BaseAdapter) 来为每个单独的片段显示正确的图像。如果没有静态元素,我看不到第二个片段如何与第一个片段交互。

编辑:我尝试更改为 Picasso,但发生了同样的错误,所以我的代码中一定有一些东西。

Edit2:我发现了这个answer,它确实让我可以在片段变得可见时重新绘制网格,但这会导致明显的闪烁,并且很明显图像是错误的。问题必须出在 UIL/Picasso 认为单独片段中的网格视图是同一个对象的某个地方(它们确实具有相同的图像但顺序不同)。

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];
    }
}

片段网格

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" />

【问题讨论】:

    标签: android gridview android-fragments universal-image-loader fragmentpageradapter


    【解决方案1】:

    您的两个片段实例之间的唯一区别是您的参数 Bundle 中的 mSortType 根据页面设置为 01。您只使用它来设置 mThemes,而您似乎从未在您的 ImageAdapter 中使用它。

    因此,如果您希望您的两个 ImageAdapter 实例返回单独的结果,则需要注意 mSortType 或者让它根据页面而有所不同。

    【讨论】:

    • mThemes 被创建,然后基于 mSortType 排序(通过比较方法)。然后将 mThemes 传递给 ImageAdapter 并称为 imageAdapterThemeList。排序类型 0 和 1 导致 mThemes 不同,因此每个 ImageAdapter 应该不同。显示的图像似乎总是来自片段 0 之后创建的片段 1。如果我单击片段 0 中的一个,它会显示正确的虽然信息。
    • @easycheese:很抱歉——很难跟踪不断变化的变量名称。您可以尝试在getView() 中记录theme.getImageURL(),看看是否能给您提供线索。
    • 您确实让我想到了正确的方向,我能够找到问题所在。我不明白根本原因,也许你可以看看答案并告诉我我错过了什么。
    【解决方案2】:

    不久前我遇到了一个听起来与此非常相似的问题。原来是交换页面时使用的动画,与寻呼机或适配器完全无关。本质上,动画导致fragment1位于fragment2之上但完全透明,因此用户认为他们正在触摸fragment2,但事件由fragment1接收......这使得它的行为非常像适配器返回错误的fragment.. .

    简而言之,如果您正在使用动画(尤其是 z 顺序更改动画),请尝试禁用它们,看看问题是否会消失。如果是这样,您的动画就有问题。

    希望对您有所帮助, 祝你好运。

    【讨论】:

    • 没有动画,但想法很好。我知道 fragmentpageradapter 使片段可见和不可见
    【解决方案3】:

    好的,我找到了答案,但我不知道为什么。我必须更改以下内容:

    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,我只是指向旧的。这种新方法实际上是重新创建它,但我敢肯定它不是很有效。

    【讨论】:

    • “我认为,与其创建一个新的 ArrayList,我只是指向旧的”——这在一定程度上取决于您对 getModifiedThemeList() 的实现。鉴于您如何使用此ArrayList&lt;Theme&gt;,您确实需要数组列表的单独副本。使用复制构造函数 (new ArrayList&lt;Theme&gt;(themes)) 会更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多