2016-04-10 2 views
0

Перерыв уже несколько тем, но не может найти ответ на вопрос - что случилось? мой MenuFragment.java (с ListView)ArrayAdapter требует, чтобы идентификатор ресурса был TextView, почему?

public class MenuFragment extends ListFragment { 

    private ArrayList<Recipe.RecipeType> mUsedRecipeType; 
    private ArrayList<Recipe> mRecipes; 
    private ListView mRecipeTypeListView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.menu_fragment, container, false); 

     mRecipeTypeListView = (ListView) view.findViewById(android.R.id.list); 
     mRecipeTypeListView.setEmptyView(view.findViewById(android.R.id.empty)); 


     return view; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mRecipes = RecipeLab.get(getActivity()).getRecipes(); 
     mUsedRecipeType = new ArrayList<>(); 
     calculateTypes(); 

     Log.d(MainActivity.TAG, "length arr " + mUsedRecipeType.size()); 

     ArrayAdapter<Recipe.RecipeType> adapter = new ArrayAdapter<Recipe.RecipeType>(getActivity(), 
       android.R.layout.simple_list_item_1, mUsedRecipeType); 
     setListAdapter(adapter); 

//  RecipeTypeAdapter recipeTypeAdapter = new RecipeTypeAdapter(mUsedRecipeType); 
//  setListAdapter(recipeTypeAdapter); 

     setRetainInstance(true); 
    } 

// private class RecipeTypeAdapter extends ArrayAdapter<Recipe.RecipeType> { 
// 
//  public RecipeTypeAdapter(ArrayList<Recipe.RecipeType> recipeTypes) { 
//   super(getActivity(), 0, recipeTypes); 
//  } 
// 
//  @Override 
//  public View getView(int position, View convertView, ViewGroup parent) { 
//   if (convertView == null) 
//    convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_recipe_type, parent, false); 
// 
//   Recipe.RecipeType recipeType = getItem(position); 
// 
//   TextView titleTextView = (TextView) convertView.findViewById(R.id.recipe_type_list_item_titleTextView); 
//   titleTextView.setText(recipeType.toString()); 
// 
//   return convertView; 
//  } 
// } 

    private void calculateTypes() { 

     for (Recipe recipe: mRecipes) { 
      if (!mUsedRecipeType.contains(recipe.getRecipeType())) 
       mUsedRecipeType.add(recipe.getRecipeType()); 
     } 
    } 
} 

мой list_item_recipe_type.xml (с TextView)

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

    <TextView 
     android:id="@+id/recipe_type_list_item_titleTextView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingLeft="4dp" 
     android:paddingRight="4dp" 
     android:textStyle="bold" 
     android:gravity="center"/> 

</LinearLayout> 

и у меня есть стек ERRor

04-10 21:44:15.206 29961-29980/? I/OpenGLRenderer: Initialized EGL, version 1.4 
04-10 21:44:15.263 29961-29961/? E/ArrayAdapter: You must supply a resource ID for a TextView 
04-10 21:44:15.263 29961-29961/? D/AndroidRuntime: Shutting down VM 
04-10 21:44:15.265 29961-29961/? E/AndroidRuntime: FATAL EXCEPTION: main 
                Process: com.luxary_team.simpleeat, PID: 29961 
                java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
                 at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:393) 
                 at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369) 
                 at android.widget.AbsListView.obtainView(AbsListView.java:2346) 
                 at android.widget.ListView.makeAndAddView(ListView.java:1876) 
                 at android.widget.ListView.fillDown(ListView.java:702) 
                 at android.widget.ListView.fillFromTop(ListView.java:763) 
                 at android.widget.ListView.layoutChildren(ListView.java:1671) 
                 at android.widget.AbsListView.onLayout(AbsListView.java:2148) 
                 at android.view.View.layout(View.java:16636) 
                 at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                 at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1207) 
                 at android.view.View.layout(View.java:16636) 
                 at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                 at android.view.View.layout(View.java:16636) 
                 at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                 at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:435) 
                 at android.view.View.layout(View.java:16636) 
                 at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                 at android.view.View.layout(View.java:16636) 
                 at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) 
                 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) 
                 at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) 
                 at android.view.View.layout(View.java:16636) 
                 at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                 at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) 
                 at android.view.View.layout(View.java:16636) 
                 at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                 at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171) 
                 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931) 
                 at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
                 at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
                 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                 at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                 at android.view.Choreographer.doFrame(Choreographer.java:606) 
                 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                 at android.os.Handler.handleCallback(Handler.java:739) 
                 at android.os.Handler.dispatchMessage(Handler.java:95) 
                 at android.os.Looper.loop(Looper.java:148) 
                 at android.app.ActivityThread.main(ActivityThread.java:5417) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView 
                 at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386) 
                 at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)  
                 at android.widget.AbsListView.obtainView(AbsListView.java:2346)  
                 at android.widget.ListView.makeAndAddView(ListView.java:1876)  
                 at android.widget.ListView.fillDown(ListView.java:702)  
                 at android.widget.ListView.fillFromTop(ListView.java:763)  
                 at android.widget.ListView.layoutChildren(ListView.java:1671)  
                 at android.widget.AbsListView.onLayout(AbsListView.java:2148)  
                 at android.view.View.layout(View.java:16636)  
                 at android.view.ViewGroup.layout(ViewGroup.java:5437)  
                 at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1207)  
                 at android.view.View.layout(View.java:16636)  
                 at android.view.ViewGroup.layout(ViewGroup.java:5437)  
                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)  
                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273)  
                 at android.view.View.layout(View.java:16636)  
                 at android.view.ViewGroup.layout(ViewGroup.java:5437)  
                 at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:435)  
                 at android.view.View.layout(View.java:16636)  
                 at android.view.ViewGroup.layout(ViewGroup.java:5437)  
                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)  
                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273)  
                 at android.view.View.layout(View.java:16636)  
                 at android.view.ViewGroup.layout(ViewGroup.java:5437)  
                 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)  
                 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)  
                 at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)  
                 at android.view.View.layout(View.java:16636)  
                 at android.view.ViewGroup.layout(ViewGroup.java:5437)  
                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)  
                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273)  
                 at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)  
                 at android.view.View.layout(View.java:16636)  
                 at android.view.ViewGroup.layout(ViewGroup.java:5437)  
                 at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171)  
                 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931)  
                 at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)  
                 at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)  
                 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)  
                 at android.view.Choreographer.doCallbacks(Choreographer.java:670)  
                 at android.view.Choreographer.doFrame(Choreographer.java:606)  
                 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)  
                 at android.os.Handler.handleCallback(Handler.java:739)  
                 at android.os.Handler.dispatchMessage(Handler.java:95)  
                 at android.os.Looper.loop(Looper.java:148)  
                 at android.app.ActivityThread.main(ActivityThread.java:5417)  
                 at java.lang.reflect.Method.invoke(Native Method)  
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Во-первых, как видно из комментария на код, я хотел использовать мой ArrayAdapter, но после получения ошибки решил использовать стандарт, тогда стандартный стандарт list_item.xml. Но все время есть одна и та же ошибка. Скажите, пожалуйста, что случилось?

+0

Я имею в виду 'simple_list_item_1' только имеет' TextView', поэтому он пытается использовать только вид он имеет в ArrayAdapter. – Petro

+2

Если вы хотите использовать свой собственный макет, вы должны иметь только «TextView», а не «TextView» в «LinearLayout». –

+0

Но даже с использованием стандартного макета возникает проблема – abbath0767

ответ

1

По умолчанию ArrayAdapter пытается найти textview с id="@android:id/text1", на котором он устанавливает текстовое значение из массива. если вы укажете настраиваемый макет, вы должны убедиться, что textview также имеет android:id="@android:id/text1" или использовать другой конструктор ArrayAdapter, где вы указываете textViewResourceId. Таким образом, изменение

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

<TextView 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="4dp" 
    android:paddingRight="4dp" 
    android:textStyle="bold" 
    android:gravity="center"/> 

</LinearLayout> 

Должно работать

+0

извините, что это 'text1' – Remco

+0

thx! действительно работает – abbath0767

-1

Вам нужен собственный макет с TextView для детали может быть попробовать с сортировщика ид и Offcourse android.R.layout.simple_list_item_1 сделать это R.layout. (Id_of_textview)

Смежные вопросы