2016-12-10 5 views
0

私のフラグメントにlistviewを実装しようとしていますが、フラグメントクラスとアダプタでエラーが発生しています。配列を使用してフラグメント内のAndroidリストビュー

マイフラグメントのxml:

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

マイリスト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> 

アダプタ:

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; 

}; 
} 

そして、私のフラグメント:

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; 

} 

私はfragmentpageradapterが私のアダプタに適用することはできませんエラー取得しています:

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

をし、別のエラーMyAccount_Adapterが適用できないとアダプタが私のフラグメントに適用することはできません。

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

はこれです文脈によって引き起こされる?私はそれを解決する方法がわかりません。

+1

なぜフラグメントページャアダプタですか?これはViewPager向けです! https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter –

答えて

2
  • あなたはListViewFragmentPagerAdapterを設定することはできません。

    ListViewのsetAdapter()には、ListAdapterListAdapterを実装するアダプタ)がパラメータとして必要です。

    BaseAdapterを使用できます。

  • アダプターのコンテキストとしてthisを渡すことはできません。

    フラグメント中のthisは、そのフラグメントを意味するので、活性ではない。

    だから、あなたはgetActivity()

例アダプタ合格する必要があります。最適化のために

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; 

}; 
} 

をこのリンクを参照してください:Using a BaseAdapter with ListView

更新:あなたが得ることができます

唯一rootViewから、明らかにそのが&を既存のこのコード

MyAccount_Adapterアダプタ=新しいMyAccount_Adapter(getActivity()、optionTitle、option_icon)を試してみてくださいgetActivity()

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

あなたの返事ありがとう、私はあなたが言ったが、今私はコードを実行すると、このエラーが表示されます:仮想メソッドを呼び出す'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' nullオブジェクトリファレンスで、あなたはそれを解決する方法を教えてくれますか? – JerryKo

+0

@JerryKoサンプルアダプタを使用して回答を更新しました。疑問がある場合は、今すぐ実装した質問でコードを更新してください –

+0

ありがとうございます。コードを更新しましたが、まだこのエラーが表示されています:仮想メソッド 'void android.widget.ListView.setAdapter(android.widget.ListAdapte r)'をnullオブジェクト参照に追加します。コード – JerryKo

0

を使用して、あなたの活動から得ることができないよう。 listView。setAdapter(アダプタ);

+0

を実行した後、getActivity()にコードを変更しましたが、フラグメントクラスにエラーはなくなりましたが、アダプタでエラーが発生しました。スーパー(コンテキスト、R.layout.myaccount_options_viewholder、option_title) ;私はそれが私の文脈と関係があるかもしれないと思うあなたは一見をしてくださいできますか? – JerryKo

関連する問題