jor
jor

Reputation: 105

Android expandablelist, example, error

Im trying to get the example from Android developer up and running. Im using the second example class.

From the line:

       TextView textView = new TextView(ExpandableList1.this);

im getting the following error in eclipse:

       ExpandableList01 cannot be resolved to a type

Im really a beginner and have been struggeling really hard to manage to make a supersimple expandable listview, but im not getting anywhere. Anyone?

Code block causing error:

   public TextView getGenericView() {
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, 64);

        TextView textView = new TextView(ExpandableList1.this);
        textView.setLayoutParams(lp);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        // Set the text starting position
        textView.setPadding(36, 0, 0, 0);
        return textView;
    }

Edit, more code..

ExpandableList1.java:

package com.test.exlist;

import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;

//import com.example.android.apis.R;


public class ExpandableList1 extends ExpandableListActivity {

    ExpandableListAdapter mAdapter;

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

        // Set up our adapter
        mAdapter = new MyExpandableListAdapter();
        setListAdapter(mAdapter);
        registerForContextMenu(getExpandableListView());
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        menu.setHeaderTitle("Sample menu");
        menu.add(0, 0, 0, R.string.expandable_list_sample_action);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();

        String title = ((TextView) info.targetView).getText().toString();

        int type = ExpandableListView.getPackedPositionType(info.packedPosition);
        if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
            int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
            int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition); 
            Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos,
                    Toast.LENGTH_SHORT).show();
            return true;
        } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
            int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
            Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show();
            return true;
        }

        return false;
    }
}

MyExpandableListAdapter.java:

package com.test.exlist;    

import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

import com.test.exlist.ExpandableList1;


public class MyExpandableListAdapter extends BaseExpandableListAdapter {
        // Sample data set.  children[i] contains the children (String[]) for groups[i].
        private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" };
        private String[][] children = {
                { "Arnold", "Barry", "Chuck", "David" },
                { "Ace", "Bandit", "Cha-Cha", "Deuce" },
                { "Fluffy", "Snuggles" },
                { "Goldy", "Bubbles" }
        };

        public Object getChild(int groupPosition, int childPosition) {
            return children[groupPosition][childPosition];
        }

        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }

        public int getChildrenCount(int groupPosition) {
            return children[groupPosition].length;
        }

        public TextView getGenericView() {
            // Layout parameters for the ExpandableListView
            AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, 64);

            TextView textView = new TextView(ExpandableList1.this);
            textView.setLayoutParams(lp);
            // Center the text vertically
            textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
            // Set the text starting position
            textView.setPadding(36, 0, 0, 0);
            return textView;
        }

        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                View convertView, ViewGroup parent) {
            TextView textView = getGenericView();
            textView.setText(getChild(groupPosition, childPosition).toString());
            return textView;
        }

        public Object getGroup(int groupPosition) {
            return groups[groupPosition];
        }

        public int getGroupCount() {
            return groups.length;
        }

        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                ViewGroup parent) {
            TextView textView = getGenericView();
            textView.setText(getGroup(groupPosition).toString());
            return textView;
        }

        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }

        public boolean hasStableIds() {
            return true;
        }

}

Upvotes: 2

Views: 3814

Answers (2)

tribe84
tribe84

Reputation: 5622

OK, what you have done is take the getGenericView() method from the sample docs, using the "this" keyword in that scenario will work, because "this" refers to the context of the Activity (the outer class in the example).

The best way to bind to an adapter is to inflate views (that is defined in xml). This way, Android will handle that for you.

Here is an example of a getView method from one of my adapters:

@Override
public View getView(int position, View convertview, ViewGroup parent) {
    View v = convertview;
    final NoteInformationItemEntity e = (NoteInformationItemEntity) getItem(position);

    if (v == null) {
        LayoutInflater vi = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        v = vi.inflate(R.layout.reminder_item, null);
    }

    ImageView img = (ImageView)v.findViewById(R.id.reminder_item_imgIcon);
    TextView txtTitle = (TextView)v.findViewById(R.id.reminder_item_txtTitle);
    TextView txtMainDescription = (TextView)v.findViewById(R.id.reminder_item_txtMainDescription);
    TextView txtSubDescription = (TextView)v.findViewById(R.id.reminder_item_txtSubDescription);

    img.setImageDrawable(mContext.getResources().getDrawable(e.getImageResourceID()));
    txtTitle.setText(e.getTitle());
    txtMainDescription.setText(Html.fromHtml(e.getMainDescription()));
    txtSubDescription.setText(Html.fromHtml(e.getSubDescription()));

    return v;
}

R.layout.reminder_item is a xml file in your layout directory.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:background="@drawable/list_item_styled_9"
android:layout_width="fill_parent">
<ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_margin="5dip"
    android:id="@+id/reminder_item_imgIcon"></ImageView>
<LinearLayout android:layout_height="wrap_content"
    android:orientation="vertical" android:layout_width="fill_parent">
    <LinearLayout android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:layout_weight="1"
        android:orientation="horizontal">
        <TextView android:layout_height="wrap_content"
            android:id="@+id/reminder_item_txtTitle" style="@style/ReminderListTitle"
            android:layout_width="wrap_content" android:layout_weight="1"></TextView>
    </LinearLayout>
    <LinearLayout android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:layout_weight="1"
        android:orientation="vertical">
        <TextView android:layout_height="wrap_content"
            android:layout_width="fill_parent" android:layout_weight="1"
            android:id="@+id/reminder_item_txtMainDescription" style="@style/ReminderListText"></TextView>
        <TextView android:layout_height="wrap_content"
            android:layout_width="fill_parent" android:layout_weight="1"
            android:id="@+id/reminder_item_txtSubDescription" style="@style/ReminderListText"></TextView>
    </LinearLayout>
</LinearLayout>

I pass the context and my data to my adapter in the constructor:

Context mContext;
ArrayList<NoteInformationItemEntity> data;

public NoteListViewItemAdapter(Context context, ArrayList<NoteInformationItemEntity> _data)
{
    mContext = context;
    data = _data;
}

If you don't want to inflate the views like the example above, you can use that context to create your TextView

public TextView getGenericView() {
    // Layout parameters for the ExpandableListView
    AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, 64);

    TextView textView = new TextView(mContext);
    textView.setLayoutParams(lp);
    // Center the text vertically
    textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
    // Set the text starting position
}

Upvotes: 1

tribe84
tribe84

Reputation: 5622

If the TextView is inside on an Activity, you can use the following code:

TextView textView = new TextView(this);

If you are creating it outside of an activity, you need to give it a context, possibly something like:

public class UIHelper
{
    private Context mContext;

    public UIHelper(Context context)
    {
        mContext = context;
    }

    public TextView getGenericView() {

            TextView textView = new TextView(mContext);
            //Do your other stuff here
            return textView;
    }
}

And you will call it from an activity like:

UIHelper u = new UIHelper(this);
TextView txt = u.getGenericView();

Upvotes: 0

Related Questions