2013-11-14 15 views
9

Ho una vista elenco con 20 righe e voglio impostare un cercapersone come ogni riga in una vista elenco. Poiché gli elementi che entrano nella mia fila della vista elenco possono uno o più di uno, e voglio mostrare gli elementi della riga della vista elenco usando un pager di visualizzazione.Visualizza cercapersone come lista Visualizza riga articolo

Per questo sto usando il seguente codice:

layout personalizzato che deve essere indicato nella riga vista elenco (come la voce di cercapersone)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/inner_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_marginRight="6.0dip" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:gravity="center_vertical" 
     android:text="Example Value" 
     android:textAppearance="?android:textAppearanceMedium" /> 

principale Visualizza elenco Oggetto riga personalizzato con View Pager

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 


     <android.support.v4.view.ViewPager 
     android:id="@+id/mypager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

MyPagerAdapter Classe

public class MyPagerAdapter extends PagerAdapter { 

    private Context context; 

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

    @Override 
    public int getCount() { 
     return 4; 
    } 

    @Override 
    public Object instantiateItem(View container, int position) { 
     LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     LinearLayout view = inflater.inflate(R.layout.inner_layout_file, null); 
     ((ViewPager) container).addView(view, position); 
     return view; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object obj) { 
     return view == ((View) obj); 
    } 

    @Override 
    public void destroyItem(View container, int position, Object object) { 
     // TODO Auto-generated method stub 
     ((ViewPager) container).removeView((View) object); 
    } 
} 

elenco Visualizza adattatore GET vista del metodo di

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 


    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); 

    MyPagerAdapter adapter = new MyPagerAdapter(context); 
    ViewPager myPager = (ViewPager) convertView.findViewById(R.id.mypager); 
    myPager.setAdapter(adapter); 

    myPager.setCurrentItem(0); 

    return convertView; 
} 

sto ottenendo alcun errore e la vista che è reso dopo l'esecuzione è sempre vuota.

+0

Sto affrontando lo stesso problema .. puoi dirci se lo aggiusti? – Coderji

+0

Sì, posso aiutarti, mostrami il tuo codice dove stai ottenendo lo stesso. Vorrei suggerire di pubblicare una domanda con il tuo codice ur e la esaminerò e ti risponderò. –

+0

per favore ecco la mia domanda http://stackoverflow.com/questions/20774098/viewpager-within-listview-row-item – Coderji

risposta

0

Modificare la linea in instantiateItem() da:

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

a:

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

Ho affrontato lo stesso problema. Basta dare un'altezza ad entrambi i viewpager e, se necessario, al contenitore principale del layout della riga di visualizzazione elenco.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="40dip" 
    android:orientation="horizontal" > 


     <android.support.v4.view.ViewPager 
     android:id="@+id/mypager" 
     android:layout_width="match_parent" 
     android:layout_height="40dip" /> 

</RelativeLayout> 

L'altezza deve essere impostata con il valore fisso. Se vuoi renderlo dinamico puoi provare ad impostarlo nella tua codifica in fase di esecuzione.

2

ho creato campione app

Esempio ViewPager con frammento: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip

MA c'è un grande svantaggio. Tutte le cellule sono memorizzati nella memoria, e l'applicazione può bloccarsi con poca memoria, se si dispone di un sacco di cellule

EDIT:

Empiricamente è stato trovato. Se usi semplicemente visualizza invece frammento in ViewPager. posso scrivere un adattatore in modo corretto e non essere colpito con la memoria

Esempio ViewPager con vista: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

Spero che qualcuno possa aiutare

5

ho affrontato lo stesso problema e risolto facendo fornendo id al viewpager in modo dinamico nel metodo getView().

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 


    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); 

    MyPagerAdapter adapter = new MyPagerAdapter(context); 
    ViewPager myPager = (ViewPager) convertView.findViewById(R.id.mypager); 

    **myPager.setId(position + getCount());** 

    myPager.setAdapter(adapter); 

    myPager.setCurrentItem(0); 

    return convertView; 
} 

Spero che questo possa aiutarti.

+0

Questo ha funzionato per me. Ma non sono sicuro di come !!! –

+0

Grazie mille !! Sono rimasto bloccato per un mese su questo e la soluzione è stata così semplice e così stupida. Ancora non capisco –

+0

Ricevo un'eccezione "Impossibile trovare l'ID risorsa" quando provo a utilizzare questo metodo con un viewholder –

-3
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder viewHolder; 


     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.listview_row, parent, false); 
     CustomeListModel customeListModel = arrayList.get(position); 
     Utils.d("debug", "in get view method "); 

     MyPagerAdapter adapter = new MyPagerAdapter(context, customeListModel); 
     viewHolder=new ViewHolder(); 

     viewHolder.viewPager= (ViewPager) convertView.findViewById(R.id.mypager); 
     viewHolder.viewPager.setId(position + getCount()); 
     viewHolder.viewPager.setAdapter(adapter); 
    viewHolder.viewPager.setMinimumWidth(100); 
    viewHolder.viewPager.setCurrentItem(1); 

    viewHolder.viewPager.setPageMargin(-380); 

    convertView.setTag(viewHolder); 

    return convertView; 
} 
+0

Potresti aggiungere qualche contesto al tuo codice? Contesto – ppperry

+0

acquisito dal costruttore –