2011-09-11 44 views
12

我對Android開發和開發總體上比較陌生。我無法理解ViewPager的語法/過程。Android ViewPager和ListViews

我有幾個ListViews,我想實現到一個ViewPager。我已經加載了兼容包以及一切。但我還沒有看到如何做到這一點的完整例子。

我通過查看示例學習得最好。如果有人可以發佈任何您已經實施過這類項目的項目的示例,請告訴我。

的問題是,我得到一個空指針異常此線路上嘗試推出我的活動時:

listView1.setAdapter(new ArrayAdapter<Object>(this, R.layout.rowlayout, list1)); 

我懷疑,我只是在做這一切是錯誤的。如果我不使用ViewPager,我可以使用這兩個列表來顯示它們的內容。所以我知道名單是不是空...

編輯:

感謝VenomM下面的答案!這是我最終使用的代碼,稍微修改了VenomM的例子。

ViewPagerAdapter:

public class ViewPagerAdapter extends PagerAdapter implements TitleProvider 
{ 
    private ListView listView1; 
    private static String[] titles = new String[] 
    { 
     "Page 1", 
     "Page 2", 
     "Page 3", 
    }; 
    private final Context context; 

    public ViewPagerAdapter(Context context) 
    { 
     this.context = context; 
    } 

    @Override 
    public String getTitle(int position) 
    { 
     return titles[ position ]; 
    } 

    @Override 
    public int getCount() 
    { 
     return titles.length; 
    } 

    @Override 
    public Object instantiateItem(View collection, int position) { 

     LayoutInflater layoutInflater = ((Activity) context).getLayoutInflater(); 

     listView1 = (ListView) layoutInflater.inflate(R.layout.listview1, null); 

     String[] listData = null; 
     MyArrayAdapter dataAdapter; 

     if (position == 0) { 
      listData = context.getResources().getStringArray(R.array.list1); 
      dataAdapter = new MyArrayAdapter((Activity) context, 
       R.layout.rowlayout, listData); 
     } else if (position == 1) { 
      listData = context.getResources().getStringArray(R.array.list2); 
      dataAdapter = new MyArrayAdapter((Activity) context, 
       R.layout.rowlayout, listData); 
     } else { 
      listData = context.getResources().getStringArray(R.array.list3); 
      dataAdapter = new MyArrayAdapter((Activity) context, 
       R.layout.rowlayout, listData); 
     } 

     listView1.setAdapter(dataAdapter); 
     listView1.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapter, View view, 
       int position, long arg3) { 
       Toast.makeText(context, 
        adapter.getAdapter().getItem(position).toString(), 
        Toast.LENGTH_LONG).show(); 
      } 
     }); 

     ((ViewPager) collection).addView(listView1, 0); 

     return listView1; 
    } 


    @Override 
    public void destroyItem(View collection, int position, Object view) { 
     System.out.println("on destroyItem()"); 
     ((ViewPager) collection).removeView((ListView) view); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     System.out.println("on isViewFromObject()"); 
     return view == ((ListView) object); 
    } 

    @Override 
    public void finishUpdate(View view) {} 

    @Override 
    public void restoreState(Parcelable p, ClassLoader c) {} 

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

    @Override 
    public void startUpdate(View view) {} 
} 

ArrayAdapter:

public class MyArrayAdapter extends ArrayAdapter<String>{ 

    private Activity context = null; 
    private String[] names = null; 
    private int rowLayoutId; 
    public MyArrayAdapter(Activity context, int textViewResourceId, String[] names) { 
     super(context, textViewResourceId, names); 
     this.context = context; 
     this.names = names; 
     this.rowLayoutId =textViewResourceId; 
    } 

    // static to save the reference to the outer class and to avoid access to 
    // any members of the containing class 
    static class ViewHolder { 
     protected ImageView imageView; 
     protected TextView textView; 
    } 

} 
+0

https://androidbeasts.wordpress.com/2015/08/11/tabs-with-swipe-views/#more-79 – Aakash

回答

5

我還是不明白你爲什麼用對象參數改變你的Arrayadapter,如果你想讓它保存字符串項。 嘗試改變

new ArrayAdapter<Object>(this, R.layout.rowlayout, list1) 

new ArrayAdapter<String>(this, R.layout.rowlayout, list1) 

我使用自定義ArrayAdapter,一切對我來說工作得很好。請讓我知道你是否成功。

+2

謝謝,我稍後再試。但我仍然認爲我的問題是ViewPagerAdapter。我發現這個例子:http://blog.stylingandroid.com/archives/542;但他只是顯示了用相同數據的代碼創建ListView。我希望能夠從不同的陣列創建不同的頁面。 – explosivo

+0

Ohk,[Here](http://pastie.org/private/drwczszfcwr3hn0b5egcfa)就是我用相同的例子(尋呼機適配器部分)演奏的。不確定,如果這是做到這一點的最佳方式。希望這可以解決你的問題:) 也[此](http://pastie.org/private/sa3z85dmgabbgelmssgxw)是我使用的自定義適配器。 – VenoM

+0

@VenomM非常感謝!這正是我所期待的。 – explosivo

0

哪個ViewPager您使用的? V4 Compatibility jar?

如果是這樣,請仔細檢查事件。具體來說onCreate,onCreateView & onActivityCreated之間的區別。

+0

是的,我使用兼容jar中的ViewPager。我明白如何讓它在我的項目中運作。我不能理解的是如何使用strings.xml中的字符串數組來顯示自定義列表視圖。 – explosivo

3

下面是一個例子:

MainActivity:

public class MainActivity extends Activity { 

    /** Called when the activity is first created. */ 

private Context mContext; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mContext = this; 
     setContentView(R.layout.main); 
     ListView listview1 = new ListView(mContext); 
     ListView listview2 = new ListView(mContext); 
     ListView listview3 = new ListView(mContext); 

     Vector<View> pages = new Vector<View>(); 

     pages.add(listview1); 
     pages.add(listview2); 
     pages.add(listview3); 

     ViewPager vp = (ViewPager) findViewById(R.id.viewpager); 
     CustomPagerAdapter adapter = new CustomPagerAdapter(mContext,pages); 
     vp.setAdapter(adapter); 

     listview1.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A1","B1","C1","D1"})); 
     listview2.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A2","B2","C2","D2"})); 
     listview3.setAdapter(new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1,new String[]{"A3","B3","C3","D3"})); 

    } 
} 

CustomViewPagerAdapter.java

public class CustomPagerAdapter extends PagerAdapter { 

private Context mContext; 
private Vector<View> pages; 

public CustomPagerAdapter(Context context, Vector<View> pages) { 
    this.mContext=context; 
    this.pages=pages; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    View page = pages.get(position); 
    container.addView(page); 
    return page; 
} 

@Override 
public int getCount() { 
    return pages.size(); 
} 

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

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

} 

欲瞭解更多信息請查看我的博客。 Here

+0

很好的例子,但是你的適配器中的Context沒有被使用。 –