10

私は、フラグメントビューを使用して、フラグメントを使用して要素を表示しようとしています。私はlist_row.xmlのListFragmentを使用してカスタムビューのリストを作成する

グラフィカル表現をたどるよう

enter image description here

私のカスタムビューを作成しlist_row.xml fragment.xmlファイルで

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

    <!-- ListRow Left sied Thumbnail image --> 

    <LinearLayout 
     android:id="@+id/thumbnail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_marginRight="5dip" 
     android:padding="3dip" > 

     <ImageView 
      android:id="@+id/list_image" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:contentDescription="@string/image_desc"/> 
    </LinearLayout> 

    <!-- Menu name --> 

    <TextView 
     android:id="@+id/menu_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/thumbnail" 
     android:layout_toRightOf="@+id/thumbnail" 
     android:text="@string/menu_name" 
     android:textColor="#040404" 
     android:textSize="15sp" 
     android:textStyle="bold" 
     android:typeface="sans" /> 

    <!-- Description --> 

    <TextView 
     android:id="@+id/description" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/thumbnail" 
     android:layout_below="@id/menu_name" 
     android:layout_marginTop="1dip" 
     android:layout_toRightOf="@+id/thumbnail" 
     android:text="@string/description" 
     android:textColor="#343434" 
     android:textSize="10sp" 
     tools:ignore="SmallSp" /> 

    <!-- Price --> 

    <TextView 
     android:id="@+id/price" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@id/menu_name" 
     android:layout_marginRight="5dip" 
     android:gravity="right" 
     android:text="@string/price" 
     android:textColor="#10bcc9" 
     android:textSize="10sp" 
     android:textStyle="bold" 
     tools:ignore="SmallSp" /> 

</RelativeLayout> 

、私は簡単に言えばリニアレイアウト内のリストビュー

fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </ListView> 

</LinearLayout> 

私は、メニュー名、説明、価格や画像などのlist_row.xmlを移入するために必要なフィールドを持つメニューオブジェクトの配列を、持っています。私は、fragment.xmlのlistViewをlist_row要素で満たす方法を見つけることができませんでした。どんな助けやアイディアもありがとうございます。

PS:は、私が代わりにandroid:id="@+id/listView1"フィールドのfragment.xmlに考えて、私はCustomArrayAdapterクラスを作成する(SYSTEM32コメントに示唆するように)私は私の問題を解決しListFragment

+2

ちょうどその 'オーバーライドをArrayAdapter'を拡張するクラスを作成し、あなたのリストビューにlist_row.xmlを使用するには'onCreateView()' – Geros

+0

ありがとうございました。私は私の問題を解決しました – inankupeli

答えて

21

使用していますので、android:id="@id/list"を記述する必要があり、私のlistViewのアダプタとして設定します。

まず、fragment.xmlのandroid:id="@+id/listView1"android:id="@android:id/list"に変更しました。

CustomArrayAdapter.javaそれから私は私の断片クラスでそれを使用

public class CustomArrayAdapter extends ArrayAdapter<Menu> { 

    Context context; 

    public CustomArrayAdapter(Context context, int textViewResourceId, List<Menu> objects) { 
     super(context, textViewResourceId, objects); 
     // TODO Auto-generated constructor stub 
     this.context = context; 
    } 

    /*private view holder class*/ 
    private class ViewHolder { 
     ImageView imageView; 
     TextView txtMenuName; 
     TextView txtMenuDesc; 
     TextView txtPrice; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     Menu rowItem = getItem(position); 

     LayoutInflater mInflater = (LayoutInflater) context 
       .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_row, null); 
      holder = new ViewHolder(); 
      holder.txtMenuName = (TextView) convertView.findViewById(R.id.menu_name); 
      holder.txtMenuDesc = (TextView) convertView.findViewById(R.id.description); 
      holder.txtPrice = (TextView) convertView.findViewById(R.id.price); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.list_image); 
      convertView.setTag(holder); 
     } else 
      holder = (ViewHolder) convertView.getTag(); 

     holder.txtMenuDesc.setText(rowItem.getDescription()); 
     holder.txtMenuName.setText(rowItem.getName()); 
     holder.txtPrice.setText(String.valueOf(rowItem.getPrice()) + " TL"); 
     //holder.imageView.setImageResource(rowItem.getImageId()); 

     return convertView; 
    } 

} 

public static class Fragment extends ListFragment { 
     /** 
     * The fragment argument representing the section number for this 
     * fragment. 
     */ 
     public static final String ARG_SECTION_NUMBER = "section_number"; 

     private ListView listView; 
     private ArrayList<Menu> menuItems; 
     private CustomArrayAdapter mAdapter; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment, 
        container, false); 
      listView = (ListView) rootView.findViewById(android.R.id.list); 

      return rootView; 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 
      int num = getArguments().getInt(ARG_SECTION_NUMBER); 
      // GlobalList is a class that holds global variables, arrays etc 
      // getMenuCategories returns global arraylist which is initialized in GlobalList class 
      menuItems = GlobalList.getMenuCategories().get(num).getMenu(); 
      mAdapter = new CustomArrayAdapter(getActivity(), android.R.id.list, menuItems); 
      listView.setAdapter(mAdapter); 
     } 
    } 
+1

私はあなたの方法を使用しようとし、私のアプリで動作しないでください。私はLogCatでこのエラーをキャッチします: 08-06 19:15:55.099:E/AndroidRuntime(14285):java.lang.IllegalStateException:ArrayAdapterはリソースIDをTextViewにする必要があります –

+0

@inankupeliでも同じ問題があります。私plsは私が投稿した質問をチェックするhttp://stackoverflow.com/questions/23513118/i-am-getting-error-when-i-use-fragment-tabspager-in-android-java-file?noredirect=1 #comment36064183_23513118 –

+0

最後のメモリリークを解決するために必要な手がかりを教えてくれました。拡張ListFragmentのonCreateにArrayAdapterを設定すると、リークが発生し、onActivityCreatedによってリークが回避されます。ありがとう! – spy

関連する問題