-1

I am trying to use ListFragment however i get an error
Here is my LAUNCHER activity: package com.example.android.criminalintent;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

public class CrimeListActivity extends FragmentActivity{

    @Override
    public void onCreate(Bundle saved) {
        super.onCreate(saved);
        setContentView(R.layout.activity_fragment);
        FragmentManager fm = getSupportFragmentManager();
        Fragment list_of_crimes_fragment = fm.findFragmentById(R.id.fragmentContainer);
        if (list_of_crimes_fragment==null) {
            list_of_crimes_fragment = new CrimeListFragment();
            fm.beginTransaction()
            .add(R.id.fragmentContainer, list_of_crimes_fragment)
            .commit();
        }
    }
}

CrimeListFragment is just storing an arrayList<Crime>

package com.example.android.criminalintent;

import java.util.ArrayList;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;

public class CrimeListFragment extends ListFragment{
    private ArrayList<Crime> mCrimes;
    @Override
    public void onCreate(Bundle saved) {
        super.onCreate(saved);
        getActivity().setTitle(R.string.crimes_title);
        //Getting the ArrayList<Crime> from CrimeLab using SingleTon pattern
        mCrimes = CrimeLab.get(getActivity()).getCrimes();
        ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(
                getActivity(),android.R.layout.activity_list_item, mCrimes);
        setListAdapter(adapter);
        //R.layout.activity_list_item - is an android pre-defined layout which
        //has simple textView as its root element
    }
}

Crime is a simple class to be as an output in a ListFragment
CrimeLab is a manager class that stores Crimes and by getCrimes() we just retrieve ArrayList<Crime>

public ArrayList<Crime> getCrimes() {
    return mCrimes; //mCrimes-->ArrayList<Crime>
}

If we delete this piece of code:

ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(
                getActivity(),android.R.layout.activity_list_item, mCrimes);
        setListAdapter(adapter);

everything works pretty fine, however with that i dont get the problem
The app doesn`t even launched
LogCat:

03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.View.layout(View.java:14008)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.View.layout(View.java:14008)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.View.layout(View.java:14008)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.View.layout(View.java:14008)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.View.layout(View.java:14008)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.Choreographer.doFrame(Choreographer.java:532)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.os.Handler.handleCallback(Handler.java:725)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.os.Looper.loop(Looper.java:137)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.app.ActivityThread.main(ActivityThread.java:5041)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at java.lang.reflect.Method.invokeNative(Native Method)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at java.lang.reflect.Method.invoke(Method.java:511)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-03 10:11:15.835: E/AndroidRuntime(1470):     at dalvik.system.NativeStart.main(Native Method)
03-03 10:11:15.835: E/AndroidRuntime(1470): Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
03-03 10:11:15.835: E/AndroidRuntime(1470):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)
03-03 10:11:15.835: E/AndroidRuntime(1470):     ... 49 more
Anarantt
  • 289
  • 1
  • 2
  • 10
  • see if this helps you. as logcat says there is classcastexception http://stackoverflow.com/questions/20290735/java-lang-classcastexception-android-widget-linearlayout-cannot-be-cast-to-andr – virendrao Mar 03 '15 at 10:23

3 Answers3

1

Change your oncreate() method to

 @Override
    public void onCreate(Bundle saved) {
        super.onCreate(saved);
        getActivity().setTitle(R.string.crimes_title);
        //Getting the ArrayList<Crime> from CrimeLab using SingleTon pattern
        mCrimes = CrimeLab.get(getActivity()).getCrimes();
        ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(
                getActivity(),R.layout.activity_list_item, mCrimes);
        setListAdapter(adapter);
        //R.layout.activity_list_item - is an android pre-defined layout which
        //has simple textView as its root element
    }
Fahim
  • 12,198
  • 5
  • 39
  • 57
0

The solution is just change

ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(
            getActivity(),android.R.layout.activity_list_item, mCrimes);

To

ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(
                getActivity(),android.R.layout.simple_list_item_1, mCrimes);

What i was need is a standard android layout for displaying lists, and
since android.R.layout.activity_list_item compiles very well and doesnt report any errors - the mistake wasn`t obvious)

Anarantt
  • 289
  • 1
  • 2
  • 10
0

ArrayAdapter's getView implementation, expects a TextView.

331  if (convertView == null) {
332      view = mInflater.inflate(resource, parent, false);
333   } else {
334      view = convertView;
335   }
336
337   try {
338       if (mFieldId == 0) {
339           //  If no custom field is assigned, assume the whole resource is a TextView
340           text = (TextView) view;
341        } else {
342           //  Otherwise, find the TextView field within the layout
343                text = (TextView) view.findViewById(mFieldId);
344        }
345    } catch (ClassCastException e) {
346       Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
347            throw new IllegalStateException(
348                    "ArrayAdapter requires the resource ID to be a TextView", e);
349    }

In the snippet, you can notice how the system cast to TextView the inflated view, if mFiledId is 0 (default value). If you want to use your layout, you have to provide also this mFieldId, with the following constructor

 ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(
            getActivity(),R.layout.activity_list_item, R.id.text_view_id_list_item, mCrimes);
Blackbelt
  • 156,034
  • 29
  • 297
  • 305