2011-09-11 38 views
12

Soy relativamente nuevo en desarrollo y desarrollo de Android en general. Tengo problemas para comprender la sintaxis/proceso de ViewPager.Android ViewPager y ListViews

Tengo varias ListViews que quiero implementar en una ViewPager. Tengo el paquete de compatibilidad cargado y todo. Pero no he visto ejemplos completos de cómo hacer esto.

Aprendo mejor mirando ejemplos. Si alguien puede publicar ejemplos de cualquier proyecto en el que haya implementado este tipo de cosas, hágamelo saber.

La cuestión es que me da una excepción de puntero nulo en esta línea cuando se trata de poner en marcha mi actividad:

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

Sospecho que estoy haciendo todo mal. Si no uso ViewPager, puedo obtener ambas listas para mostrar su contenido. Así que sé que las listas no son nulos ...

EDIT:

Gracias a VenomM por la respuesta de abajo! Aquí está el código que terminé usando, ligeramente modificado a partir de los ejemplos de 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

Respuesta

5

Todavía no puedo entender por qué cambias tu Arrayadapter con argumento de objeto, si quieres que contenga elementos de cadena. Intente cambiar

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

a

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

utilicé una costumbre ArrayAdapter, todo funcionaba bien para mí. Por favor, avíseme si tiene éxito.

+2

Gracias, lo intentaré más tarde. Pero todavía creo que mi problema es ViewPagerAdapter. Encontré este ejemplo: http://blog.stylingandroid.com/archives/542; pero él solo muestra la creación de ListViews en código a partir de los mismos datos.Quiero ser capaz de crear diferentes páginas de diferentes matrices. – explosivo

+0

Ohk, [Aquí] (http://pastie.org/private/drwczszfcwr3hn0b5egcfa) es lo que jugué con el mismo ejemplo (parte del adaptador del localizador). No estoy seguro, si esta es la mejor manera de hacer esto. Espero que esto resuelva tus problemas :) También [este] (http://pastie.org/private/sa3z85dmgabbgelmssgxw) es el adaptador personalizado que utilicé. – VenoM

+0

@VenomM ¡Muchas gracias! Esto es exactamente lo que estaba buscando. – explosivo

0

Qué ViewPager está utilizando? ¿El contenedor de compatibilidad V4?

Si es así, compruebe dos veces los eventos. Específicamente la diferencia entre onCreate, onCreateView & onActivityCreated.

+0

Sí, estoy usando ViewPager desde el jar de compatibilidad. Entiendo cómo hacerlo funcionar en mi proyecto. Lo que no puedo entender es cómo hacer que muestre vistas de listas personalizadas utilizando matrices de cadenas de strings.xml. – explosivo

3

Aquí se muestra un ejemplo:

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

} 

Para más información consultar mi blog. Here.

+0

Buen ejemplo, pero el Contexto en su adaptador no se está utilizando. –