2015-02-15 3 views
0

Я только начинаю разработку Android и вам нужно создать расширяемый вид списка. Я следую за этот учебник: http://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/Android ExpandableListAdapter: ArrayAdapter требует, чтобы идентификатор ресурса был TextView

Приложение компилируется и работает успешно, однако я получаю следующее сообщение об ошибке:

java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView

я нашел подобные вопросы на веб-сайте, а также читать Array Adapter documentation, и кажется, что я должен либо:

A) "Обеспечить единый TextView как идентификатор ресурса (который я не хочу делать, как я хочу, чтобы создать пользовательский макет с ImageView). "

-или-

В) "Используйте конструкторы, которые также принимает идентификатор поля. Этот идентификатор поля должен ссылаться на TextView в более крупном ресурсе макета. »

Моя проблема заключается в том, что упомянутый учебник не использует простой ArrayAdapter, а BaseExpandableListAdapter, чья constructor действительно не принимает никаких параметров, которые кажутся? я должен передать ссылку на TextView с BaseExpandableListAdapter

Я простирающийся его следующим образом:

package net.jekyllhyde.myapplication; 

import android.content.Context; 
import android.graphics.Typeface; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.TextView; 

import java.util.HashMap; 
import java.util.List; 

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<String> _listDataHeader; // header titles 
    // child data in format of header title, child title 
    private HashMap<String, List<String>> _listDataChild; 

    public ExpandableListAdapter(Context context, 
           List<String> listDataHeader, 
           HashMap<String, List<String>> listChildData) { 
     this._context = context; 
     this._listDataHeader = listDataHeader; 
     this._listDataChild = listChildData; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosititon) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .get(childPosititon); 
    } 

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

    @Override 
    public View getChildView(int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, ViewGroup parent) { 

     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_item, parent, false); 
     } 

     TextView txtListChild = (TextView) convertView 
       .findViewById(R.id.lblListItem); 

     txtListChild.setText(childText); 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return this._listDataHeader.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return this._listDataHeader.size(); 
    } 

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

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 
     String headerTitle = (String) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_group, parent, false); 
     } 

     TextView lblListHeader = (TextView) convertView 
       .findViewById(R.id.lblListHeader); 
     lblListHeader.setTypeface(null, Typeface.BOLD); 
     lblListHeader.setText(headerTitle); 

     return convertView; 
    } 

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

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

Я думаю, что я что-то очевидное здесь отсутствую (из-за мое отсутствие опыта работы с Android) и я благодарен за любую информацию.

Вся выходная ошибка LogCat, по запросу:

02-15 09:51:11.509 10170-10170/? E/AndroidRuntime? FATAL EXCEPTION: main 
Process: net.jekyllhyde.myapplication, PID: 10170 
java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386) 
     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
     at android.widget.AbsListView.obtainView(AbsListView.java:2263) 
     at android.widget.ListView.makeAndAddView(ListView.java:1790) 
     at android.widget.ListView.fillDown(ListView.java:691) 
     at android.widget.ListView.fillFromTop(ListView.java:752) 
     at android.widget.ListView.layoutChildren(ListView.java:1630) 
     at android.widget.AbsListView.onLayout(AbsListView.java:2091) 
     at android.view.View.layout(View.java:14965) 
     at android.view.ViewGroup.layout(ViewGroup.java:4631) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
     at android.view.View.layout(View.java:14965) 
     at android.view.ViewGroup.layout(ViewGroup.java:4631) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
     at android.view.View.layout(View.java:14965) 
     at android.view.ViewGroup.layout(ViewGroup.java:4631) 
     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374) 
     at android.view.View.layout(View.java:14965) 
     at android.view.ViewGroup.layout(ViewGroup.java:4631) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
     at android.view.View.layout(View.java:14965) 
     at android.view.ViewGroup.layout(ViewGroup.java:4631) 
     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1991) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1748) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5692) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
     at android.view.Choreographer.doFrame(Choreographer.java:544) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:212) 
     at android.app.ActivityThread.main(ActivityThread.java:5151) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView 
      at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
at android.widget.AbsListView.obtainView(AbsListView.java:2263) 
            at android.widget.ListView.makeAndAddView(ListView.java:1790) 
            at android.widget.ListView.fillDown(ListView.java:691) 
            at android.widget.ListView.fillFromTop(ListView.java:752) 
            at android.widget.ListView.layoutChildren(ListView.java:1630) 
            at android.widget.AbsListView.onLayout(AbsListView.java:2091) 
            at android.view.View.layout(View.java:14965) 
            at android.view.ViewGroup.layout(ViewGroup.java:4631) 
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) 
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
            at android.view.View.layout(View.java:14965) 
            at android.view.ViewGroup.layout(ViewGroup.java:4631) 
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
            at android.view.View.layout(View.java:14965) 
            at android.view.ViewGroup.layout(ViewGroup.java:4631) 
            at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374) 
            at android.view.View.layout(View.java:14965) 
            at android.view.ViewGroup.layout(ViewGroup.java:4631) 
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
            at android.view.View.layout(View.java:14965) 
            at android.view.ViewGroup.layout(ViewGroup.java:4631) 
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1991) 
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1748) 
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5692) 
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
            at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
            at android.view.Choreographer.doFrame(Choreographer.java:544) 
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
            at android.os.Handler.handleCallback(Handler.java:733) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:212) 
            at android.app.ActivityThread.main(ActivityThread.java:5151) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 
            at dalvik.system.NativeStart.main(Native Method) 
+0

Привет, не могли бы вы разместить весь логарифм этой ошибки, а также строку кода, где приложение разбивается? спасибо –

+0

Журнал сбоев указывает, что он не имеет ничего общего с вашим пользовательским адаптером. Это когда вы используете ArrayAdapter. Можете ли вы разместить соответствующий сегмент кода, где вы создаете экземпляр адаптера? –

+0

Я на самом деле не создаю экземпляр массива ArrayAdapter (также в учебнике нет упоминания о ArrayAdapter - он просто говорит, что он распространяется от BaseExpandableListAdapter). – vtosh

ответ

1

Ну BaseExpandableListAdapter, который я думаю, это лучший способ реализовать расширяемую ListView, является абстрактным классом, вы должны сделать класс самостоятельно который расширяет его и реализует методы, вы можете реализовать конструктор с необходимыми параметрами, а также переопределить другие методы, такие как getChildView, getGroupView, чтобы он работал именно так, как вам нужно.

Как это: http://numberedmountain.blogspot.com.es/p/code-example-overriding.html

EDIT: Просто головы до: даже если вы решить эту текущую ошибку, ваш ExpandableListView не будет работать должным образом, так как в методе getGroupView вы должны принять IsExpanded переменную во внимание чтобы вернуть представление группы, которая была развернута или свернута в зависимости от значения. Помимо этого, я думаю, вы сделали все правильно, ошибка не связана, как кто-то сказал в комментариях.

+0

OP уже делает то, что вы описываете –

+0

он отредактировал после моего ответа на самом деле – CyborgFish

+0

Спасибо - я посмотрю на это. – vtosh

Смежные вопросы