2011-09-11 15 views
12

私はAndroidの開発と開発の全体的な面で比較的新しいです。私はViewPagerの構文/プロセスを理解することができません。Android ViewPagerとListView

私はViewPagerに実装したいいくつかのListViewを持っています。互換性パックがロードされています。しかし、私はこれを行う方法の完全な例を見ていません。

例を見て最もよくわかります。誰かがこのようなことを実装したプロジェクトの例を投稿できる場合は、教えてください。

問題は、私の活動を起動しようとしたとき、私は、この行にNULLポインタ例外を取得することです:

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

私はちょうどすべて間違ってこれをやっていると思われます。 ViewPagerを使用しないと、両方のリストを取得してコンテンツを表示できます。以下の答えをVenomMに

ありがとう:だから私は...リストがnullではありません

EDITを知っています!ここで私が使用したコードは、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を変更する理由を理解できません。 すべてが私のためにうまく働いた、私はカスタムArrayAdapterを使用

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

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

を変更してみてください。あなたが成功すれば教えてください。ここで

+2

ありがとう、私は後でそれを試してみます。しかし、私はまだ私の問題はViewPagerAdapterだと思う。私はこの例を見つけました:http://blog.stylingandroid.com/archives/542;彼は同じデータからコードのリストビューを作成することを示しています。私は別の配列から別のページを作成できるようにしたい。 – 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を使用しています。私は私のプロジェクトでそれを働かせる方法を理解しています。私がgrokできないのは、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

良い例ですが、アダプタのコンテキストが使用されていません。 –