2012-08-24 49 views
2

我一直在拉我的頭髮一整天 - 我從PagerAdapter繼承,並從我的主要活動調用以下內容。 問題是,下面的測試總是返回null。 另外,當我調試時,我發現MyPagerAdapter.java中的instantiateItem方法根本沒有輸入!是什麼賦予了?Android - PagerAdapter實例化對象不被調用

感謝任何幫助,我可以得到。 謝謝。

碼頭。

// For the paging swipes 
    MyPagerAdapter adapter = new MyPagerAdapter(); 
    m_ViewPager = (ViewPager) findViewById(R.id.myfivepanelpager); 
    adapter.notifyDataSetChanged(); 
    m_ViewPager.setAdapter(adapter); 
    m_ViewPager.setCurrentItem(2); 

    View test = m_ViewPager.getChildAt(2); 
    ListView theList = (ListView) test.findViewById(R.id.listView1); 

MyPagerAdapter.java

public class MyPagerAdapter extends PagerAdapter { 

public int getCount() { 
    return 5; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    //Log.d("Instantiate Item", null); 
    LayoutInflater inflater = (LayoutInflater) container.getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    //View view = null; 
    View view; 

    int resId = 0; 
    switch (position) { 
    case 0: 
     resId = R.layout.page1; 
     view = inflater.inflate(resId, null); 
     TextView txtView =(TextView)view.findViewById(R.id.textView1); 
     ListView lstView = (ListView)view.findViewById(R.id.listView1); 
     break; 
    case 1: 
     resId = R.layout.page2; 
     view = inflater.inflate(resId, null); 
     TextView txtView2 =(TextView)view.findViewById(R.id.textView2); 
     break; 
    case 2: 
     resId = R.layout.page3; 
     view = inflater.inflate(resId, null); 
     TextView txtView3 =(TextView)view.findViewById(R.id.textView3); 
     break; 
    case 3: 
     resId = R.layout.page4; 
     view = inflater.inflate(resId, null); 
     TextView txtView4 =(TextView)view.findViewById(R.id.textView4); 
     break; 
    case 4: 
     resId = R.layout.page5; 
     view = inflater.inflate(resId, null); 
     TextView txtView5 =(TextView)view.findViewById(R.id.textView5); 
     break; 
    default: 
     resId = R.layout.page1; 
     view = inflater.inflate(resId, null); 
     break; 
    } 

    ((ViewPager) container).addView(view, 0); 

    return view; 
} 

@Override 
public void destroyItem(ViewGroup arg0, int arg1, Object arg2) { 
    ((ViewPager) arg0).removeView((View) arg2); 

} 


@Override 
public boolean isViewFromObject(View arg0, Object arg1) { 
    return arg0 == ((View) arg1); 

} 

@Override 
public Parcelable saveState() { 
    return null; 
} 

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 
} 
+0

通過測試失敗你的意思是你的theList是空的? – sandrstar

回答

1

首先,這條線Log.d("Instantiate Item", null);導致因空消息的異常。

我試過你的適配器,它工作正常(instantiateItem被調用,我觀察到在手機上的意見)。似乎你已經嘗試從onCreate()運行你的'測試'。你可能期望在setContentView()中剛剛膨脹的ViewPager已經準備好了,並且在通貨膨脹之後讓孩子出現。這不是事實,因爲ViewPager只需要在繪圖上使用子項目。

+0

我認爲引起異常的那個是View view = null。刪除Log.d(「Instantiate Item」,null)後,它仍然崩潰。但是你是對的,因爲有問題的代碼在這裏以及從onCreate運行測試。事情是我真的不明白,這個工程 - 假設我想在用戶點擊選擇時在頁面R.id.listView1上填充一個ListItem - 我應該在哪裏做? – lppier

+0

對此,有沒有一個很好的ViewPager教程?我一直遵循的似乎並沒有解決所有的實施問題。 – lppier

+0

關於教程 - 我知道只有http://developer.android.com/reference/android/support/v4/view/ViewPager.html有一些細節。關於異常 - 你是對的,首先我做了刪除'test.findViewById'call,但我認爲你已經提到它已經是測試失敗。關於列表項目人口的問題 - 我認爲listview(或viewpager等)是負責它。只有在使用適配器實現(或擴展現有)視圖的情況下,才能攔截它。目前android列表容器(viewpager也)填充視圖只需要繪製內容(afaik)。 – sandrstar

0

在同樣的筆記,我意識到爲了填充說,我的ListView的位置0,我在PageAdapter內部。試圖做到這一點

m_ViewPager.setCurrentItem(tab.getPosition()); 
    if (m_ViewPager != null) 
    { 
    LinearLayout test = (LinearLayout) m_ViewPager.getChildAt(tab.getPosition()); 
     if (test != null) 
     { 
      if (tab.getPosition()==0) 
      { 
       ListView theList = (ListView) test.findViewById(R.id.listView1); 
       populateListView(theList, tab.getPosition()); 
      } 
     } 
    } 

內的功能之一,我MainActivity.java文件並沒有真正爲我工作。所以基本上,我需要這樣做。希望這可以幫助像我這樣陷入困境的人。

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

    LayoutInflater inflater = (LayoutInflater) container.getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View view; 

    int resId = 0; 
    switch (position) { 
    case 0: 
     resId = R.layout.page1; 
     view = inflater.inflate(resId, null); 
     TextView textView1 =(TextView)view.findViewById(R.id.textView1); 
     ListView listView1 = (ListView)view.findViewById(R.id.listView1); 
     populateListView(listView1, container.getContext()); 
     break; 
    case 1: 
     resId = R.layout.page2; 
     view = inflater.inflate(resId, null); 
     TextView textView2 =(TextView)view.findViewById(R.id.textView2); 
     break; 
    case 2: 
     resId = R.layout.page3; 
     view = inflater.inflate(resId, null); 
     TextView textView3 =(TextView)view.findViewById(R.id.textView3); 
     break; 
    case 3: 
     resId = R.layout.page4; 
     view = inflater.inflate(resId, null); 
     TextView textView4 =(TextView)view.findViewById(R.id.textView4); 
     break; 
    case 4: 
     resId = R.layout.page5; 
     view = inflater.inflate(resId, null); 
     TextView textView5 =(TextView)view.findViewById(R.id.textView5); 
     break; 
    default: 
     resId = R.layout.page1; 
     view = inflater.inflate(resId, null); 

     break; 
    } 


    ((ViewPager) container).addView(view, 0); 
    return view; 
} 

private void populateListView(ListView list, Context thisContext) 
{ 
    // We need to use a different list item layout for devices older than Honeycomb 
    int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
      android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1; 

    // Create an array adapter for the list view, using the Ipsum headlines array 
    list.setAdapter((new ArrayAdapter<String>(thisContext, layout, Ipsum.Headlines))); 
}