2016-12-10 7 views
0

Ich versuche, eine Listview in meinem Fragment zu implementieren, aber ich bekomme Fehler in meiner Fragmentklasse und Adapter.Android ListView in Fragment mit Array

xml Mein Fragment:

 <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/divider2"> 

     <ListView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/MyAccountList" 
      android:layout_below="@+id/divider2"/> 

    </LinearLayout> 

Meine Liste viewholder:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 


<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <!-- icon --> 
    <ImageView 
     android:id="@+id/option_icon" 
     android:layout_width="64dp" 
     android:layout_height="64dp" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="@dimen/activity_horizontal_margin" 
     android:layout_marginRight="@dimen/activity_horizontal_margin" 
     android:layout_marginTop="@dimen/activity_horizontal_margin" 
     android:layout_marginBottom="@dimen/activity_horizontal_margin" 
     android:padding="@dimen/activity_horizontal_margin" 
     android:contentDescription="icon" /> 


    <!-- title --> 
    <TextView 
     android:id="@+id/option_title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/option_icon" 
     android:textColor="@android:color/darker_gray" 
     android:padding="@dimen/activity_horizontal_margin" 
     android:layout_marginTop="@dimen/activity_horizontal_margin" 
     android:layout_alignTop="@+id/option_icon" 
     android:layout_centerVertical="true"/> 

    </RelativeLayout> 

Adapter:

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 


public class MyAccount_Adapter extends BaseAdapter { 


private final Activity context; 
private final String[] option_title; 
private final Integer[] option_icon; 


public MyAccount_Adapter(Activity context, String[] option_title, Integer[] option_icon) { 
    //super(context, R.layout.myaccount_options_viewholder, option_title); 
    // TODO Auto-generated constructor stub 

    this.context=context; 
    this.option_title=option_title; 
    this.option_icon=option_icon; 
} 

@Override 
public int getCount() { 
    return option_title.length; //returns total of items in the array 
} 

@Override 
public Object getItem(int position) { 
    return option_title[position]; //returns item at the specified position 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View view, ViewGroup parent) { 
    LayoutInflater inflater=context.getLayoutInflater(); 
    View rowView=inflater.inflate(R.layout.myaccount_options_viewholder, null,true); 

    TextView txtTitle = (TextView) rowView.findViewById(R.id.option_title); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.profile_icon); 

    txtTitle.setText(option_title[position]); 
    imageView.setImageResource(option_icon[position]); 
    return rowView; 

}; 
} 

Und mein Fragment:

public class MyAccount extends Fragment { 

ListView listView; 
String[] optionTitle ={ 
     "booking record", 
     "comments", 
     "language", 
}; 

Integer[] option_icon={ 

     R.drawable.booking_record_02, 
     R.drawable.comment_record_02, 
     R.drawable.language_02, 
}; 


public MyAccount() { 
} 

public static MyAccount newInstance(String text){ 
    Bundle args = new Bundle(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

final View rootView = inflater.inflate(R.layout.my_account, container, false); 

    MyAccount_Adapter adapter=new MyAccount_Adapter(getActivity(), optionTitle, option_icon); 
    listView=(ListView)getActivity().findViewById(R.id.MyAccountList); 
    listView.setAdapter(adapter); 

return rootView; 

} 

ich Fehler bin immer fragmentpageradapter in meinem Adapter angewendet werden können:

super(context, R.layout.myaccount_options_viewholder, option_title); 

und ein weiterer Fehler MyAccount_Adapter nicht angewendet werden kann und Adapter kann nicht in meinem Fragment angewendet werden:

MyAccount_Adapter adapter=new MyAccount_Adapter(this, optionTitle, option_icon); 
listView.setAdapter(adapter); 

Ist das verursacht durch den Kontext? Ich bin mir nicht sicher, wie ich es lösen soll.

+1

Warum fragmentpageradapter? Dies ist für ViewPager! https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter –

Antwort

2
  • können Sie nicht FragmentPagerAdapter-ListView gesetzt.

    Weil in ListView ListAdapter (Adapter, der ListAdapter implementiert) als Parameter benötigt.

    Sie können BaseAdapter verwenden.

  • Sie können this nicht als Kontext für den Adapter übergeben.

    Da this im Fragment bezieht sich auf dieses Fragment, nicht Aktivität.

    So müssen Sie getActivity()

Beispiel Adapter weitergeben müssen:

public class MyAccount_Adapter extends BaseAdapter { 

private final Activity context; 
private final String[] option_title; 
private final Integer[] option_icon; 
public MyAccount_Adapter(Activity context, String[] option_title, Integer[] option_icon) { 

    this.context=context; 
    this.option_title=option_title; 
    this.option_icon=option_icon; 
} 

@Override 
public int getCount() { 
    return option_title.length; //returns total of items in the array 
} 

@Override 
public Object getItem(int position) { 
    return option_title[position]; //returns item at the specified position 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    LayoutInflater inflater=context.getLayoutInflater(); 
    View rowView=inflater.inflate(R.layout.myaccount_options_viewholder, null,true); 

    TextView txtTitle = (TextView) rowView.findViewById(R.id.option_title); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.profile_icon); 

    txtTitle.setText(option_title[position]); 
    imageView.setImageResource(option_icon[position]); 
    return rowView; 

}; 
} 

Für Optimierungen beziehen sich auf diesen Link: Using a BaseAdapter with ListView

Update:

Sie können erhaltennurvon rootView, offensichtlich als seine dort vorhandenen & kann nicht von Ihrer Tätigkeit erhalten getActivity()

listView=(ListView) rootView.findViewById(R.id.MyAccountList); 
+0

Vielen Dank für Ihre Antwort, ich habe die folgenden Änderungen vorgenommen, die Sie sagten, aber jetzt bekomme ich diesen Fehler, wenn ich den Code ausführen: Versuch, virtuelle Methode aufzurufen 'void android.widget.ListView.setAdapter (android.widget.ListAdapter)' auf eine Null-Objektreferenz, können Sie mir beibringen, wie man es löst? – JerryKo

+0

@JerryKo Aktualisierte Antwort mit Beispieladapter, wenn Sie weitere Zweifel haben, aktualisieren Sie den Code in Ihrer Frage mit dem, was Sie jetzt implementiert haben –

+0

Vielen Dank für Ihre Zeit, ich habe den Code aktualisiert, aber ich bekomme immer noch diesen Fehler: Versuch, aufzurufen virtuelle Methode 'void android.widget.ListView.setAdapter (android.widget.ListAdapter r)' auf einen Null-Objektverweis. Nach dem Ausführen des Codes – JerryKo

0

diesem Code

MyAccount_Adapter Adapter Versuchen Sie es mit = new MyAccount_Adapter (getActivity(), optionTitle, option_icon); Listenansicht.setAdapter (Adapter);

+0

habe ich den Code in getActivity() geändert, es gibt keine Fehler mehr in meiner Fragmentklasse, aber im Adapter bekomme ich immer noch Fehler bei super (Kontext, R.layout.myaccount_options_viewholder, option_title) ; Ich denke, es könnte etwas mit meinem Kontext zu tun haben. Kannst du bitte einen Blick darauf werfen? – JerryKo