0

설명서에서 데모 된 조각 사이를 전환하기 위해 스 와이프를 사용하여 탭 제목 스트립을 설정하려고합니다. 최대 지점까지 작동합니다. gridview는 필요한 모든 이미지를 표시하지만 조각 1과 조각 2 모두 동일한 이미지를 표시합니다. 조각 1의 이미지를 클릭하면 조각 2의 이미지가 표시 되더라도 조각 1의 세부 정보 화면이 나타나기 때문에 조각 2가 이미지를 덮어 쓰는 것으로 나타납니다.FragmentPagerAdapter + BaseAdapter + UIL 업데이트 안 함

기본적으로 각 별도의 조각에 대해 올바른 이미지를 표시하려면 ImageAdapter (BaseAdapter)가 필요합니다. 정적 요소가없는 경우 두 번째 조각이 첫 번째 조각과 상호 작용하는 것을 볼 수 없습니다.

편집 : Picasso로 변경해 봤는데 동일한 오류가 발생하여 내 코드에 뭔가있을 수 있습니다.

Edit2 :이 부분은 answer이며 조각이 표시되면 눈금을 다시 그릴 수 있지만 눈에 띄는 깜박임이 발생하고 이미지가 틀렸음이 분명합니다. 문제는 UIL/Picasso가 다른 조각들에있는 gridview가 같은 객체 (같은 이미지를 가지고 있지만 다른 주문을 가지고 있음)라고 생각하면서 somhere에 놓여 있어야합니다.

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

답변

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를을 만들어보다. 이 새로운 방법은 실제로 그것을 다시 만들지 만 매우 효율적이지는 않습니다.

+1

"새로운 ArrayList를 만드는 대신 이전 버전을 가리키는 것뿐입니다."- getModifiedThemeList() 구현에 약간의 영향을 미칩니다. 이'ArrayList '을 어떻게 사용하는지 감안할 때, 배열 목록을 별도로 복사해야합니다. 복사 생성자 ('new ArrayList (themes)')를 사용하는 것이 더 쉬울 것입니다. – CommonsWare

+0

좋은 지적. 도움을 주셔서 감사합니다. – easycheese

0

을 FragmentGrid. 그것은 페이지를 교환 할 때 사용되는 애니메이션으로 판명되었고, 호출기 나 어댑터와는 전혀 관련이 없습니다. 본질적으로 애니메이션은 프래그먼트 1이 프래그먼트 2 위에 오도록 만들었지 만 완전히 투명하기 때문에 사용자는 프래그먼트 2를 만지고 있다고 생각했지만 프래그먼트 1에 의해 이벤트가 수신되었으므로 어댑터가 잘못된 프래그먼트를 반환하는 것과 매우 유사하게 동작합니다.

간단히 말해서 애니메이션 (특히 z 순서 변경 애니메이션)을 사용하지 않는 경우 애니메이션을 사용 중지하고 문제가 사라지는 지 확인하십시오. 그렇다면 애니메이션에 문제가있는 것입니다.

호프가 도움이 되었으면 행운을 빕니다.

+0

애니메이션은 없지만 좋은 생각입니다. fragmentpageradapter가 프래그먼트를 보이고 보이지 않게합니다. – easycheese

1

당신의 두 조각 인스턴스 사이의 유일한 차이점은 페이지를 기반으로 인수에 mSortTypeBundle0 또는 1로 설정을 가지고있다. 이 설정을 사용하여 에서 결코 사용하지 않는 mThemes을 설정합니다.

두 개의 ImageAdapter 인스턴스가 서로 다른 결과를 반환 할 것으로 예상되는 경우 mSortType에주의를 기울이거나 그렇지 않으면 페이지에 따라 다를 수 있습니다.

+0

mThemes가 만들어지고 mSortType을 기준으로 비교됩니다 (비교 메서드를 통해). 그런 다음 mThemes가 ImageAdapter로 전달되고 imageAdapterThemeList라고합니다. 정렬 유형 0과 1을 사용하면 mThemes가 달라 지므로 각 ImageAdapter가 달라야합니다. 표시되는 이미지는 항상 조각 0 이후에 생성 된 조각 1에서 오는 것처럼 보입니다. 조각 0에서 하나를 클릭하면 올바른 정보. – easycheese

+1

@easycheese : 사과드립니다. 끊임없이 변하는 변수 이름을 추적하는 것은 어렵습니다. 'getView()'에'theme.getImageURL()'을 로깅 해보고 이것이 단서를 주는지 볼 수 있습니다. – CommonsWare

+0

당신은 나를 올바른 방향으로 생각하게 만들었고 나는 그 문제를 발견 할 수있었습니다. 나는 근본적인 이유를 이해하지 못한다. 아마도 당신은 대답을보고 내가 무엇을 놓치고 있는지 말해 줄 수있을 것이다. – easycheese