2013-07-31 2 views
1

아래 코드는 내 viewpager 용 어댑터입니다.사용자 정의 pageradapter에 대한 널 포인터 예외

import android.content.Context; 
    import android.support.v4.view.PagerAdapter; 
    import android.support.v4.view.ViewPager; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.LinearLayout; 
    import android.widget.TextView; 

    import com.androidquery.AQuery; 

    public class ViewPagerAdapter2 extends PagerAdapter { 

    Context context; 
    String[] image1; 
    String[] description; 


    LayoutInflater inflater; 

    public ViewPagerAdapter2(Context context, String[] image1,String[] description) { 
     this.context = context; 
     this.image1 = image1; 
     this.description=description; 


    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((LinearLayout) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 


     TextView des; 

     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View itemView = inflater.inflate(R.layout.slider, container, 
       false); 
     des = (TextView) itemView.findViewById(R.id.slider_des); 
     des.setText(description[position]); 
     AQuery aq = new AQuery(itemView); 
     aq.id(R.id.imageView1).image(image1[position]); 

     ((ViewPager) container).removeView(itemView); 



     ((ViewPager) container).addView(itemView); 

     return itemView; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     ((ViewPager) container).removeView((LinearLayout) object); 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return description.length; 

    } 

} 

내 조각의 코드 :

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(
       R.layout.home, container, false); 

     new getFromWebService().execute(); 
     viewPager1 = (ViewPager) mLinearLayout.findViewById(R.id.pager); 
     adapter1= new ViewPagerAdapter2(mLinearLayout.getContext(),image,title); 
     viewPager1.setAdapter(adapter1); 

     //ListView list = (ListView) mLinearLayout.findViewById(R.id.listView1); 
     //Onadapter listadapter = new Onadapter(getActivity(),id,label,title,image,hrs,posted_date); 
     //list.setAdapter(listadapter); 

     return mLinearLayout; 

    } 

내 로그 캣 출력 :

필자가 무슨 짓을
07-31 16:27:05.868: E/AndroidRuntime(1364): FATAL EXCEPTION: main 
07-31 16:27:05.868: E/AndroidRuntime(1364): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lyfcha/com.lyfcha.TestMainActivity}: java.lang.NullPointerException 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.ActivityThread.access$700(ActivityThread.java:140) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.os.Looper.loop(Looper.java:137) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.ActivityThread.main(ActivityThread.java:4921) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at dalvik.system.NativeStart.main(Native Method) 
07-31 16:27:05.868: E/AndroidRuntime(1364): Caused by: java.lang.NullPointerException 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at com.lyfcha.ViewPagerAdapter2.getCount(ViewPagerAdapter2.java:69) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:432) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at com.lyfcha.Home1.onCreateView(Home1.java:56) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.Activity.performStart(Activity.java:5216) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2083) 
07-31 16:27:05.868: E/AndroidRuntime(1364):  ... 11 more 

: JSON에서 1. 획득 필요한 데이터를 문자열 배열에. 2. iveive는 뷰 페이지가 콘텐츠를 피드로 제공 할 수 있도록 어댑터를 작성했습니다. 내가 문제로 실행 한

는 :

응용 프로그램 내 조각의 onCreateView 내 어댑터의 getCount는 NPE를 발생한다는, 널 포인터 예외가 발생합니다. 문자열 배열의 길이가 null이 아니라고 확신합니다 (디버그 퍼스펙티브의 표시 창에서 테스트 됨).

도움을 주시면 감사하겠습니다.

+0

이 우리를 표시합니다. – hardartcore

+0

title은 전역 변수로 선언됩니다. json 배열이 수신되는 클래스에서 정의 된 크기와 json에서 수신 된 데이터에서 루프에 값이 삽입됩니다. 문자열 배열에 문제가 없다는 것을 확신 할 수 있습니다! 그것은 원하는대로 값을 포함합니다! –

+0

다른 스레드에서 채워진 경우 스레드 완료 후 어댑터 추가를 고려해야합니다. – hardartcore

답변

1

데이터를 가져 오는 데 사용하는 AsyncTask에서 어댑터를 채워야합니다. getFromWebService 때문에 여전히 다른 스레드로부터의 데이터가없는 것, 다른 스레드의 선

adapter1= new ViewPagerAdapter2(mLinearLayout.getContext(),image,title); 

을 실행한다. 그래서, 솔루션은 다음과 같은 라인을 이동하는 것입니다 : 당신이 채우기 또는`title`를 초기화하는 곳에 당신의 AsyncTask를의 onPostExecute() 방법

LinearLayout mLinearLayout = (LinearLayout) inflater.inflate(
       R.layout.home, container, false); 

     viewPager1 = (ViewPager) mLinearLayout.findViewById(R.id.pager); 
     adapter1= new ViewPagerAdapter2(mLinearLayout.getContext(),image,title); 
     viewPager1.setAdapter(adapter1); 

getFromWebService

+0

getFromWebService가 실행 된 후에는 전역 적으로 선언 된 ive 문자열 배열에 의도 한 삽입 값이 있기 때문에 문제가 될 것이라고 생각하지 않습니다! 필자는 각 변수에 대해 각 변수를 검사 했으므로 그 부분에는 실수가 없습니다. ive는 AsyncTask가 작업을 완료 한 후 값을 사용했습니다. –

+0

내가 보는 문제점은'getFromWebService'가 실행될 때까지 기다리지 않고 (별도의 스레드에 있음),'description'은'getFromWebService'가있는 경우 null이 될 것입니다 별도의 실. –

+0

고마워요! 그렇게 생각하지 않으려 고 너무 바보 같았 어! 그런 어리석은 실수! 고마워요! –