user290043
user290043

Reputation:

Custom Adapter for ListView causing Error

I am getting this error:

Caused by: java.lang.RuntimeException: 
    Your content must have a ListView whose id attribute is 'android.R.id.list'

This is HomeScreen.java:

public class HomeScreen extends ListActivity {

    String TAG = AppConstants.TAG;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);

        CBasicInfo basicinfo_data[] = new CBasicInfo[]
                {
                    new CBasicInfo("Projet A", 1, new Date()),
                    new CBasicInfo("Projet A", 2, new Date()),
                    new CBasicInfo("Projet A", 3, new Date()),
                    new CBasicInfo("Projet A", 4, new Date()),
                    new CBasicInfo("Projet A", 5, new Date())
                };

        BasicInfoAdapter adapter = new BasicInfoAdapter(this, R.layout.home_screen_list_item, basicinfo_data);
        ListView list_view = (ListView)findViewById(R.id.lvSavedProjects);
        list_view.setAdapter(adapter);
    }
}

And here my adapter BasicInfoAdapter.java:

public class BasicInfoAdapter extends ArrayAdapter<CBasicInfo>{

    Context context; 
    int layoutResourceId;    
    CBasicInfo data[] = null;

    public BasicInfoAdapter(Context context, int layoutResourceId, CBasicInfo[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        BasicInfoHolder holder = null;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new BasicInfoHolder();
            holder.txtName = (TextView)row.findViewById(R.id.tvHomeScreenProjectName);
            holder.txtPid = (TextView)row.findViewById(R.id.tvHomeScreenPid);
            holder.txtDDate = (TextView)row.findViewById(R.id.tvHomeScreenDownloadDate);

            row.setTag(holder);
        }
        else
        {
            holder = (BasicInfoHolder)row.getTag();
        }

        CBasicInfo bi = data[position];
        holder.txtName.setText(bi.getName());
        holder.txtPid.setText(bi.getId());
        holder.txtDDate.setText(bi.getExportDate().toString());

        return row;
    }

    static class BasicInfoHolder
    {
        TextView txtName;
        TextView txtPid;
        TextView txtDDate;
    }
}

My home.xml is:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/lbl_saved_projects"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    <ListView
        android:id="@+id/lvSavedProjects"
        android:name="android.app.ListFragment"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="0.86" />
    <Button
        android:id="@+id/bDownloadMoreProjects"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/lbl_download_more_projects" />
</LinearLayout>

What the heck am I doing wrong here?

Thx

EDIT:

The stack trace shows:

FATAL EXCEPTION: main
android.content.res.Resources$NotFoundException: String resource ID #0x1
    at android.content.res.Resources.getText(Resources.java:247)
    at android.widget.TextView.setText(TextView.java:3473)
    at com.snip.tnc.SnipForAndroid.BasicInfoAdapter.getView(BasicInfoAdapter.java:48)
    at android.widget.AbsListView.obtainView(AbsListView.java:2033)
    at android.widget.ListView.makeAndAddView(ListView.java:1772)
    at android.widget.ListView.fillDown(ListView.java:672)
    at android.widget.ListView.fillFromTop(ListView.java:732)
    at android.widget.ListView.layoutChildren(ListView.java:1625)
    at android.widget.AbsListView.onLayout(AbsListView.java:1863)
    at android.view.View.layout(View.java:11278)
    at android.view.ViewGroup.layout(ViewGroup.java:4224)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
    at android.view.View.layout(View.java:11278)
    at android.view.ViewGroup.layout(ViewGroup.java:4224)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
    at android.view.View.layout(View.java:11278)
    at android.view.ViewGroup.layout(ViewGroup.java:4224)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
    at android.view.View.layout(View.java:11278)
    at android.view.ViewGroup.layout(ViewGroup.java:4224)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
    at android.view.View.layout(View.java:11278)
    at android.view.ViewGroup.layout(ViewGroup.java:4224)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1489)
    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4424)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)

Upvotes: 1

Views: 1994

Answers (2)

Squonk
Squonk

Reputation: 48871

As K-Ballo points out, the layout for a ListActivity must have a ListView with id android.R.id.list. The first part (android.R) translates to @android: and the second to id/list so...

Set the id of you ListView to be @android:id/list. and it will automatically be used.

You then should delete the line where you use findViewById(...) (not necessary for a ListActivity). Then you just use...

setListAdapter(adapter);

You don't need to find the ListView to set the Adapter as the above method that ListActivity exposes does it automatically.

If you do need the ListView for other purposes, however, use...

getListView();

Upvotes: 1

K-ballo
K-ballo

Reputation: 81349

The error is quite clear:

Your content must have a ListView whose id attribute is 'android.R.id.list'

so it seems you don't have one at R.layout.home. By the way, your problem has nothing to do with Adapters but with ListActivity.

The ListView in your layout should have this as its id attribute:

android:id="@android:id/list`

I'm not sure what your android:name attribute is doing there.

Upvotes: 2

Related Questions