ListFragment не принимает мой макет

Согласно этой ссылке: разработчики Android-разработчиков BlockFragment

Я хочу установить свой собственный макет для списка, но он делает исключения.

Вот код:

public class ListFragmentActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); FragmentManager fm = getSupportFragmentManager(); if(fm.findFragmentById(android.R.id.content) == null) { myListFragments list = new myListFragments(); fm.beginTransaction().add(android.R.id.content, list).commit(); } } public static class myListFragments extends ListFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.topoffers, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); List offers = Global.getInstance().getOffers(); List topOffers = new ArrayList(4); for (int i = 0; i < 4; i++) { if (offers.get(i).getOfferImage() == null) offers.get(i).setOfferImage( downloadFile(offers.get(i).getOfferImageUrl())); topOffers.add(offers.get(i)); } LazyAdapter adapter = new LazyAdapter(getActivity()); adapter.setData(topOffers); setListAdapter(adapter); setListShown(true); } public Bitmap downloadFile(String fileUrl) { URL myFileUrl = null; try { myFileUrl = new URL(fileUrl); } catch (MalformedURLException e) { e.printStackTrace(); return null; } try { HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); return BitmapFactory.decodeStream(is); } catch (IOException e) { e.printStackTrace(); return null; } } }} 

и мой пользовательский макет – R.layout.topoffers

Logcat:

  05-15 21:43:56.975: W/dalvikvm(218): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 05-15 21:43:56.975: E/AndroidRuntime(218): Uncaught handler: thread main exiting due to uncaught exception 05-15 21:43:56.995: E/AndroidRuntime(218): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.anddev.android.ikiwi/org.anddev.android.ikiwi.ListFragmentActivity}: java.lang.IllegalStateException: Can't be used with a custom content view 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.os.Handler.dispatchMessage(Handler.java:99) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.os.Looper.loop(Looper.java:123) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.ActivityThread.main(ActivityThread.java:4363) 05-15 21:43:56.995: E/AndroidRuntime(218): at java.lang.reflect.Method.invokeNative(Native Method) 05-15 21:43:56.995: E/AndroidRuntime(218): at java.lang.reflect.Method.invoke(Method.java:521) 05-15 21:43:56.995: E/AndroidRuntime(218): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 05-15 21:43:56.995: E/AndroidRuntime(218): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 05-15 21:43:56.995: E/AndroidRuntime(218): at dalvik.system.NativeStart.main(Native Method) 05-15 21:43:56.995: E/AndroidRuntime(218): Caused by: java.lang.IllegalStateException: Can't be used with a custom content view 05-15 21:43:56.995: E/AndroidRuntime(218): at android.support.v4.app.ListFragment.setListShown(ListFragment.java:282) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.support.v4.app.ListFragment.setListShown(ListFragment.java:258) 05-15 21:43:56.995: E/AndroidRuntime(218): at org.anddev.android.ikiwi.ListFragmentActivity$myListFragments.onActivityCreated(ListFragmentActivity.java:57) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:891) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:505) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.Activity.performStart(Activity.java:3723) 05-15 21:43:56.995: E/AndroidRuntime(218): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468) 05-15 21:43:56.995: E/AndroidRuntime(218): ... 11 more 05-15 21:43:57.025: I/dalvikvm(218): threadid=7: reacting to signal 3 05-15 21:43:57.025: E/dalvikvm(218): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 

Это звучит как проблема, о которой уже сообщалось в Google.

Проблема с Google

Если это действительно ваша проблема, в нижней части этой страницы есть несколько предложений по ее исправлению (лучше, чем больше работать, чем исправлять).

Создайте файл макета list_content.xml

            

Поместите это внутри classа ListFragment :

 public ListView mList; boolean mListShown; View mProgressContainer; View mListContainer; public void setListShown(boolean shown, boolean animate){ if (mListShown == shown) { return; } mListShown = shown; if (shown) { if (animate) { mProgressContainer.startAnimation(AnimationUtils.loadAnimation( getActivity(), android.R.anim.fade_out)); mListContainer.startAnimation(AnimationUtils.loadAnimation( getActivity(), android.R.anim.fade_in)); } mProgressContainer.setVisibility(View.GONE); mListContainer.setVisibility(View.VISIBLE); } else { if (animate) { mProgressContainer.startAnimation(AnimationUtils.loadAnimation( getActivity(), android.R.anim.fade_in)); mListContainer.startAnimation(AnimationUtils.loadAnimation( getActivity(), android.R.anim.fade_out)); } mProgressContainer.setVisibility(View.VISIBLE); mListContainer.setVisibility(View.INVISIBLE); } } public void setListShown(boolean shown){ setListShown(shown, true); } public void setListShownNoAnimation(boolean shown) { setListShown(shown, false); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { int INTERNAL_EMPTY_ID = 0x00ff0001; View root = inflater.inflate(R.layout.list_content, container, false); (root.findViewById(R.id.internalEmpty)).setId(INTERNAL_EMPTY_ID); mList = (ListView) root.findViewById(android.R.id.list); mListContainer = root.findViewById(R.id.listContainer); mProgressContainer = root.findViewById(R.id.progressContainer); mListShown = true; return root; } 

Теперь вы можете нормально использовать:

 setListShown(boolean shown); setListShown(boolean shown, boolean animate); setListShownNoAnimation(boolean shown); 

Источник:

http://source-android.frandroid.com/frameworks/base/core/java/android/app/ListFragment.java

http://source-android.frandroid.com/frameworks/base/core/res/res/layout/list_content.xml

Это может быть проще: создайте свой макет, как обычно, но не добавьте список / пустое / загрузочное содержимое. Затем в вашем списке onCreateView:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = super.onCreateView(inflater, container, savedInstanceState); ViewGroup parent = (ViewGroup) inflater.inflate(R.layout.mylayout, container, false); parent.addView(v, 0); return parent; } 

Теперь вы можете использовать setListShown …

Просто замените исходный ListView на свой макет CustomListView внутри метода onCreateView. Работал для меня.

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = super.onCreateView(inflater, container, savedInstanceState); ListView lv = (ListView) layout.findViewById(android.R.id.list); ViewGroup parent = (ViewGroup) lv.getParent(); // Remove ListView and add CustomView in its place int lvIndex = parent.indexOfChild(lv); parent.removeViewAt(lvIndex); LinearLayout mLinearLayout = (LinearLayout) inflater.inflate( R.layout.custom_list, container, false); parent.addView(mLinearLayout, lvIndex, lv.getLayoutParams()); return layout; } 

Сегодня у меня была такая же проблема. Глядя на решение в Google, я нашел сообщение в японском блоге. ( http://blog.nkzn.net/entry/2012/06/14/160706 ).

Для использования setListShown(boolean) вы должны сделать сначала в своем макете:

           

Теперь в вашем ListFragment:

 public class SampleListFragment extends ListFragment { /** ID for progressbar parent */ private static final int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002; /** ID for listview parent */ private static final int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.custom_list_layout, container, false); // get you progressBar and his parent ProgressBar pBar = (ProgressBar) view.findViewById(android.R.id.progress); LinearLayout pframe = (LinearLayout) pBar.getParent(); pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID); ListView listView = (ListView) view.findViewById(android.R.id.list); listView.setItemsCanFocus(false); FrameLayout lFrame = (FrameLayout) listView.getParent(); lFrame.setId(INTERNAL_LIST_CONTAINER_ID); return view; } } 

с этими двумя номерами идентификаторов, установленными в его родителях setListShown (boolean), будет работать без проблем.

Другое решение, которое сработало для меня, – это просто поставить эту строку

  

вместо вашего списка.

Вы можете создать собственный контент поверх него или окружить его некоторыми другими видами. Например, вот как выглядит мой макет:

         

Мне просто нужно было изменить мои текстовые свойства TextView и сделать это

 @Override public void onLoadFinished(Loader loader, Cursor cursor) { // Swap the new cursor in. (The framework will take care of closing the // old cursor once we return) mAdapter.swapCursor(cursor); if (cursor.getCount() == 0) { setEmptyText(getString(R.string.no_users)); TextView tvEmpty = (TextView) getListView().getEmptyView(); tvEmpty.setTextColor(getResources().getColor(R.color.blue)); } // The list should now be shown. if (isResumed()) { setListShown(true); } else { setListShownNoAnimation(true); } } 

Не забывайте, что если вы попробуете инициализировать tvEmpty перед вызовом setEmptyText("Empty") , вы setEmptyText("Empty") с NullPointerException

Этот код работал для меня:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = super.onCreateView(inflater, container, savedInstanceState); ((TextView)root.findViewById(0x00ff0001)).setText("some text"); ListView list = (ListView) root.findViewById(android.R.id.list); list.setEmptyView(root.findViewById(0x00ff0001)); return root; } 

Немного поздно, но не видел этого ответа.

Внутри Fragment :

  @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_list_activity, container, false); ListFragmentHelper.adaptView(view); return view; } 

но имейте в виду, что в fragment_list_activity.xml вам нужно установить идентификаторы android:id="@id/loading" , android:id="@id/content" и android:id="@id/empty" для ваших просмотров !

Попробуйте удалить setListShown(true); ?

У меня была такая же проблема, некоторое время назад. Это швы, которые вы не можете использовать, если у вас есть пользовательский макет в ListFragment .

  • Удалить элементы ListView на Android
  • Справка относительно события onClick () для элемента пользовательской строки списка ListView
  • Как изменить цвет линии разделителя Android ListView?
  • Android: реализация progressbar и «загрузка ...» для бесконечного списка, например Android Market
  • Push Listview, когда клавиатура появляется без настройкиPan
  • Android получает точную позицию прокрутки в ListView
  • Программно перейдите к определенной позиции в Android ListView
  • При проверке флажка в listview также проверяются другие случайные флажки
  • Android: доступ к дочерним представлениям из списка ListView
  • как установить режим выбора для списка с изображениями
  • notifyDataSetChanged () делает обновление списка и прокручивает подсказки назад
  • Давайте будем гением компьютера.