работа с ExpandableListView с XML и кодом - PullRequest
0 голосов
/ 06 сентября 2011

Я просто пытался создать несколько групп и соответствующих им детей в упражнении.Пока безуспешно.Перепробовал разные предложения людей по разным вопросам, но они не смогли заставить мой код работать.Возможно, я не совсем понимаю концепцию и делаю что-то, что не решает мою проблему!

Я хочу указать макет расширяемого списка, вида группы и дочернего вида через XML.Я хочу манипулировать данными через код.В настоящее время я использую BaseExpandableListAdpater, но в будущем я хочу, чтобы он работал и с SimpleCursorTreeAdapter.

Ниже приведен код, который я написал:

1) menuitems.xml - фактический ExpandableListView

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

    <!-- Menu Title -->
    <!-- <TextView  android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="Menu Categories"
                android:textSize="20sp"/> -->

    <!-- Menu sorted according to the categories -->
    <ExpandableListView android:id="@android:id/list"
                        android:layout_height="fill_parent" 
                        android:layout_width="fill_parent"
                        >
    </ExpandableListView>

</LinearLayout>

2) group_list.xml - макет для заполнения группы, то есть родительского элемента

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <TextView android:id="@+id/groupListId"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
            android:textSize="15dp"
            android:gravity="center"
            android:text="group"
  />

</LinearLayout>

3) child_list.xml - дочерний список, соответствующий родительскому элементу (group_list.xml)

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

  <TextView android:id="@+id/childListId"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:textSize="20dp"
            android:gravity="center"
            android:text="child"
  />

</LinearLayout>

4) FoodieActivity.java

public class FoodieActivity extends ExpandableListActivity {
    /** Called when the activity is first created. */

    ExpandableListView expandableMenuCategories = null;
    ExpandableListAdapter expandableListMenuAdapter = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menuitems);

        expandableMenuCategories = getExpandableListView();

        expandableListMenuAdapter = new MyMenuCategoriesAdapter();

        setListAdapter(expandableListMenuAdapter);
        registerForContextMenu(expandableMenuCategories);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) 
    {
        //TODO
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        return super.onContextItemSelected(item);
    }

    public class MyMenuCategoriesAdapter extends BaseExpandableListAdapter
    {

            String[] categoryGroups = {"One,Two,Three"};
        String[][] categoryItems = {{"Number","Integer"},{"Float","Double"},{"short,byte"}};

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return categoryItems[groupPosition][childPosition];
        }

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

        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) 
        {
//          TextView childView = null;

            convertView = ((LayoutInflater.from(FoodieActivity.this)).inflate(R.layout.child_list, null));
            convertView = (TextView) convertView.findViewById(R.id.childListId);
//          TextView childView = new TextView(FoodieActivity.this);
//          childView.setLayoutParams(expandableMenuCategories.getLayoutParams());
            ((TextView)convertView).setText(getChild(groupPosition, childPosition).toString());

            return convertView;
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return categoryItems[groupPosition].length;
        }

        @Override
        public Object getGroup(int groupPosition) {
            return categoryGroups[groupPosition];
        }

        @Override
        public int getGroupCount() {
            return categoryGroups.length;
        }

        @Override
        public long getGroupId(int groupPosition) {
            return categoryGroups[groupPosition].length();
        }

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) 
        {
//          TextView groupView = null;
            try
            {
                convertView = ((LayoutInflater.from(FoodieActivity.this)).inflate(R.layout.group_list,parent, false));
                convertView = (TextView) convertView.findViewById(R.id.groupListId);
//              TextView groupView = new TextView(FoodieActivity.this);
//              groupView.setLayoutParams(expandableMenuCategories.getLayoutParams());
                ((TextView)convertView).setText(getGroup(groupPosition).toString());
            }
            catch(ClassCastException cce)
            {
                Log.d(cce.toString(), cce.getMessage());
            }

            return convertView;
        }

        @Override
        public boolean hasStableIds() {
            return true;
        }

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

    }
}

Когда я запускаю этот конкретный код, я получаю ClassCast исключение:

09-06 18:29:11.145: ERROR/AndroidRuntime(1031): FATAL EXCEPTION: main
09-06 18:29:11.145: ERROR/AndroidRuntime(1031): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.ListView.setupChild(ListView.java:1761)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.ListView.makeAndAddView(ListView.java:1730)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.ListView.fillDown(ListView.java:652)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.ListView.fillFromTop(ListView.java:709)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.ListView.layoutChildren(ListView.java:1580)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.AbsListView.onLayout(AbsListView.java:1147)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.view.View.layout(View.java:7035)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.view.View.layout(View.java:7035)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.view.View.layout(View.java:7035)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.view.View.layout(View.java:7035)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.view.View.layout(View.java:7035)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.os.Looper.loop(Looper.java:123)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at java.lang.reflect.Method.invokeNative(Native Method)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at java.lang.reflect.Method.invoke(Method.java:521)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-06 18:29:11.145: ERROR/AndroidRuntime(1031):     at dalvik.system.NativeStart.main(Native Method)

Во-вторых, мне не ясно, чтоимеется ли convertView и parent в методах:

public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent)

и

public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) 

Кто-нибудь может объяснить это их значение?

В-третьих, я хотел получить Idэлемента expandableListView из XML, но идентификатор не создается, поскольку мы вынуждены присвоить идентификатор как android:id="@android:id/list". Я имею в виду, что в классе R.id идентификаторы не созданы.

-Adithya

1 Ответ

0 голосов
/ 24 апреля 2012

Прежде всего, кажется, что следующее неверно.

@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) 
{
    //TextView childView = null;

    convertView = ((LayoutInflater.from(FoodieActivity.this)).inflate(R.layout.child_list, null));
    **convertView = (TextView) convertView.findViewById(R.id.childListId);**

    ((TextView)convertView).setText(getChild(groupPosition, childPosition).toString());

    return convertView;
}

Здесь конвертированный вид наиболее вероятно будет макетом.Вы не можете привести это к textView.

...