Domanda

Sono relativamente nuovo nello sviluppo e nello sviluppo Android in generale. Ho problemi a cogliere la sintassi/processo per ViewPager.

Ho diversi Visualizzazioni che voglio implementare in un ViewPager. Ho caricato il pacchetto di compatibilità e tutto. Ma non ho visto esempi completi di come farlo.

Imparo meglio guardando esempi. Se qualcuno può pubblicare esempi di progetti in cui hai implementato questo genere di cose, per favore fatemelo sapere.

Il problema è che ricevo un'eccezione null puntatore su questa riga quando provo a lanciare la mia attività:

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

Sospetto che sto solo facendo tutto questo sbagliato. Se non uso il ViewPager, posso ottenere entrambi gli elenchi per visualizzare i loro contenuti. Quindi so che le liste non sono nulle ...

MODIFICARE:

Grazie a Venomm per la risposta qui sotto! Ecco il codice che ho finito per usare, leggermente modificato dagli esempi di 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;
    }

}
È stato utile?

Soluzione

Non riesco ancora a capire perché cambi il tuo ArrayAdapter con l'argomento dell'oggetto, se vuoi che contenga elementi di stringa. Prova a cambiare

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

a

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

Ho usato un arrayadapter personalizzato, tutto ha funzionato bene per me. Per favore fatemi sapere se hai successo.

Altri suggerimenti

Ecco un esempio:

Attività principale:

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);
 }

}

Per ulteriori informazioni, consultare il mio blog. Qui.

Quale mirino stai usando? Il barattolo di compatibilità V4?

In tal caso, ricontrolla gli eventi. In particolare la differenza tra OnCreate, OnCreateView e Onactivity Created.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top