2013-11-14 11 views
9

Ich habe eine Listenansicht mit 20 Zeilen und ich möchte einen Ansichtspager als jede Zeile in einer Listenansicht einrichten. Da die Elemente, die in meiner Zeile der Listenansicht angezeigt werden, eins oder mehr als eins sein können, und ich die Zeilenelemente der Listenansicht mithilfe eines Ansichtspagers anzeigen möchte.Pager als Listenansicht anzeigen Row Item

Dafür ich den folgenden Code verwenden:

benutzerdefiniertes Layout, die in der Listenansicht Zeile (als Pager Artikel)

<?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" /> 

Haupt gezeigt werden soll Listenansicht Benutzerdefiniertes Zeilenelement mit Sichtpager

<?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 Klasse

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

Listenansicht Adapter GET VIEW METHODE

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

Ich erhalte keinen Fehler und die Ansicht, die nach dem Ausführen es gerendert wird immer leer.

+0

Ich bin mit dem gleichen Problem konfrontiert .. können Sie bitte sagen, wenn Sie es beheben? – Coderji

+0

Ja, ich kann Ihnen helfen, zeigen Sie mir Ihren Code, wo Sie das gleiche bekommen. Ich würde vorschlagen, eine Frage mit Ihrem Code zu stellen und ich werde es überprüfen und Ihnen antworten. –

+0

bitte hier ist meine Frage http://stackoverflow.com/questions/20774098/viewpager-within-listview-row-item – Coderji

Antwort

0

Ändern Sie die Zeile in instantiateItem() aus:

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

zu:

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

ich konfrontiert gleiche Problem. Geben Sie sowohl dem Viewpager als auch dem Hauptcontainer Ihres Listenansichtszeilenlayouts eine Höhe.

<?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> 

Höhe muss durch festen Wert festgelegt werden. Wenn Sie es dynamisch machen möchten, können Sie versuchen, es zur Laufzeit in Ihrem Code festzulegen.

2

I erstellt Probe app

Beispiel ViewPager mit Fragment: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip

BUT es gibt einen großen Nachteil. Alle Zellen werden im Speicher abgelegt, und die Anwendung kann durch geringen Speicher abstürzen, ob Sie eine Menge von Zellen haben

EDIT:

Empirisch wurde gefunden worden ist. Wenn Sie einfach Ansicht statt Fragment in ViewPager verwenden. Ich kann einen Adapter richtig schreiben und nicht mit dem Speicher

Beispiel ViewPager mit Blick geschlagen werden: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

Ich hoffe, jemand helfen kann

5

Ich habe das gleiche Problem konfrontiert und gelöst durch dynamische Bereitstellung der ID für den Viewpager in der Methode 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; 
} 

Hoffe, das kann Ihnen helfen.

+0

Dies funktionierte für mich. Aber ich bin mir nicht sicher, wie !!! –

+0

Vielen Dank !! Ich war für einen Monat auf diesem und die Lösung war so einfach und so dumm .. Ich verstehe immer noch nicht –

+0

Ich bekomme eine Ausnahme "Ressource ID nicht finden", wenn Sie versuchen, diese Methode mit einem 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

Könnten Sie bitte etwas Kontext zu Ihrem Code hinzufügen? – ppperry

+0

Kontext vom Konstruktor erfasst –