다른 간단한보기 중에 ViewPager를 포함하는 레이아웃이 있습니다. 이 레이아웃을 ListView에 대한 목록 항목으로 사용하고 있으며 정상적으로 작동합니다. 그러나 ViewHolder 패턴을 구현하려고하면 아래로 스크롤 할 때 응용 프로그램이 충돌합니다. 뷰 페이저에 어댑터를 설정하면 오류가 발생합니다.없이ViewPager가 포함 된 ListView에서 ViewHolder 패턴 구현
어댑터 ViewHolder 구현 :
public class FaceInSandAdapter extends ArrayAdapter<Gem> {
private Context mContext;
public FaceInSandAdapter(Context c, ArrayList<Gem> gems) {
super(c, 0, gems);
mContext = c;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Gem gem = getItem(position);
convertView = ((Activity) mContext).getLayoutInflater().inflate(
R.layout.list_item_gem, null);
final ViewPager pager = (ViewPager) convertView
.findViewById(R.id.list_item_gem_photosViewPager);
pager.setId(gem.getId());
pager.setAdapter(new PhotoSliderPagerAdapter(((FragmentActivity) parent
.getContext()).getSupportFragmentManager(), gem.getImageUrls()));
TextView address = (TextView) convertView
.findViewById(R.id.list_item_gem_addressTextView);
address.setText(gem.getAddress());
return convertView;
}
}
가 어떻게 올바르게 ViewPager를 포함하는 레이아웃을 팽창 어댑터에 대한 ViewHolder 패턴을 구현합니까?
FATAL EXCEPTION: main
Process: xx.yyy.zzzzzz, PID: 5010
android.content.res.Resources$NotFoundException: Unable to find resource ID #0x3fe1
at android.content.res.Resources.getResourceName(Resources.java:1776)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:442)
at xxx.xxx.xxx.FaceInSandAdapter.getView(FaceInSandAdapter.java:89)
at android.widget.AbsListView.obtainView(AbsListView.java:2240)
at android.widget.ListView.makeAndAddView(ListView.java:1790)
at android.widget.ListView.fillDown(ListView.java:691)
at android.widget.ListView.fillGap(ListView.java:655)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5136)
at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4247)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:543)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
: 나는 ViewHolder 패턴의 내 구현을 얻을 오류에 대한
스택 트레이스를
public class FaceInSandAdapter extends ArrayAdapter<Gem> {
private Context mContext;
public FaceInSandAdapter(Context c, ArrayList<Gem> gems) {
super(c, 0, ads);
mContext = c;
}
static class ViewHolder {
ViewPager pager;
TextView address;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
final Gem gem = getItem(position);
if (convertView == null) {
convertView = ((Activity) mContext).getLayoutInflater().inflate(
R.layout.list_item_gem, null);
holder = new ViewHolder();
holder.pager = (ViewPager) convertView
.findViewById(R.id.list_item_gem_photosViewPager);
holder.address = (TextView) convertView
.findViewById(R.id.list_item_gem_addressTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
FragmentManager fm = ((FragmentActivity) convertView.getContext())
.getSupportFragmentManager();
holder.pager.setId(gem.getId());
holder.pager.setAdapter(new PhotoSliderPagerAdapter(fm, gem
.getImageUrls()));
holder.address.setText(gem.getAddress());
return convertView;
}
}
편집 : 다음은 위에서 언급 한 오류를 제공 구현 같은 어댑터에서 내 시도이다
** 편집 2 **
이제 viepager가 목록보기 항목으로 작업 할 때 남아있는 문제 PagerAdapter의 베어 본 구현 (저장 상태 없음, 오프 스크린 뷰 제한 없음)이있는 ImageViews를 인스턴스화하고 있으므로 목록이 많은 양의 메모리를 사용하게됩니다.
android.content.res.Resources$NotFoundException: Unable to find resource ID #0x3fe1
당신이 존재하지 않는 참조하는 ID가있는 것으로 보인다 :
이 뷰 홀더 패턴이 실제로 필요합니까? 뚜껑에 얼마나 많은 물건이 있습니까? – pskink
최대 10 개의보기가 있습니다. 여기서는 간략하게 생략했습니다. –
예외 스택 트레이스를 게시 할 수 있습니까? – curtisLoew