10

조각을 사용하여 목록보기에 요소를 표시하려고합니다. 나는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> 

, 나는 단순히 넣어 list_row.xml의

그래픽 표현을 따를 때 내 사용자 정의보기를 생성 선형 레이아웃 내부의 목록보기

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> 

는 I 메뉴 이름, 설명, 가격 및 이미지 등 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도 같은 문제가 있습니다. u 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