Пользовательский ExpandableListView аварийно завершает работу в setAdapter

Я пытаюсь создать собственный ExpandableListView, но он всегда выдает NullPointException. Я пытался отладить его, и он всегда падает в myExpandableList.setAdapter(listAdapter)

Я искал другие решения, отправка контекста в форме «ManagerListActivity.this» и «это» не помогла.

Примеры кода:

открытый класс ManagerListActivity расширяет SherlockActivity {

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

    // Get the ExpandableListView
    ExpandableListView managerList = (ExpandableListView) findViewById(R.id.list_manager);
    ManagerListAdapter listAdapter = new ManagerListAdapter(ManagerListActivity.this);

    ArrayList<Subordinate> managers = new ArrayList<Subordinate>();
    ArrayList<Employee> employees = new ArrayList<Employee>();

    ArrayList<String> listDataHeader = new ArrayList<String>();
    HashMap<String, List<String>> listDataChild = new HashMap<String, List<String>>();

// Я пропускаю часть, где я создаю менеджеров и сотрудников

        for (int i = 0; i < managers.size(); i++) {
            // Name the headers
            listDataHeader.add(managers.get(i).getFirstName());
            List<String> childList = new ArrayList<String>();

            for (int j = 0; j < managers.get(i).getProjects().size(); j++) {
                // Name the children
                childList.add(managers.get(i).getProjects().get(j)
                        .getProjectName());
            }

            listDataChild.put(listDataHeader.get(i), childList);
        }

    listAdapter = new ManagerListAdapter(this, managers, listDataChild,
            employees);
    managerList.setAdapter(listAdapter);
}

Теперь адаптер:

открытый класс ManagerListAdapter расширяет 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;
private ArrayList<Subordinate> managers;
private ArrayList<Employee> employees;
String phone = "";

public ManagerListAdapter(Context context, ArrayList<Subordinate> managers,
        HashMap<String, List<String>> listDataChild,
        ArrayList<Employee> employees) {
    this.context = context;
    for (int i = 0; i < managers.size(); i++) {
        _listDataHeader.add(managers.get(i).getFirstName());
    }
    this._listDataChild = listDataChild;
    this.employees = employees;
}

@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_manager_child,
                null);
    }

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

    txtListChild.setText(childText);
    return convertView;
}


@Override
public View getGroupView(int pos, boolean isExpanded, View view,
        ViewGroup parent) {
    if (view == null) {
        LayoutInflater infalInflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = infalInflater.inflate(R.layout.list_manager_item, null);
    }

    TextView lblListHeader = (TextView) view
            .findViewById(R.id.manager_firstname);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(managers.get(pos).getFirstName());

    // Use the holder to pass data to the call button
    RowViewHolder holder = new RowViewHolder();
    holder.callImg = (ImageView) view.findViewById(R.id.gl_call);
    holder.callImg.setOnClickListener(callListener);
    view.setTag(holder);

    phone = employees.get(pos).getContact();

    return view;
}

// Call button handling
private OnClickListener callListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        try {
            Intent i = new Intent(Intent.ACTION_CALL);
            i.setData(Uri.parse("tel:" + phone));
            context.startActivity(i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

protected static class RowViewHolder {
    public ImageView callImg;
}

Конечно, я также реализовал все другие необходимые методы, которые нужны BaseExpandableListAdapter.

Любая помощь будет оценена по достоинству.

ОБНОВИТЬ:

Экстракт логарифма:

11-06 16:13:46.283: E/AndroidRuntime(924): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 11-06 16:13:46.283: E/AndroidRuntime(924): java.lang.RuntimeException: невозможно запустить активность ComponentInfo{com. tcs.mobility.uy.rmg/com.tcs.mobility.uy.rmg.ManagerListActivity}: java.lang.NullPointerException 11-06 16:13:46.283: E/AndroidRuntime (924): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2180) 11-06 16:13:46.283: E/AndroidRuntime(924): в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 11-06 16:13:46.283: E/AndroidRuntime (924): в android.app.ActivityThread.access$600(ActivityThread.java:141) 11-06 16:13:46.283: E/AndroidRuntime(924): в android.app.ActivityThread$H.handleMessage(ActivityThread.java :1234) 11-06 16:13:46.283: E/AndroidRuntime(924): at android.os.Handler.dispatchMessage(Handler.java:99) 11-06 16:13:46.283: E/AndroidRuntime(924): на android.os.Looper.loop(Looper.java:137) 11-06 16:13:46.283: E/AndroidRuntime(924): на андроиде d.app.ActivityThread.main(ActivityThread.java:5039) 11-06 16:13:46.283: E/AndroidRuntime(924): в java.lang.reflect.Method.invokeNative(собственный метод) 11-06 16:13 :46.283: E/AndroidRuntime(924): на java.lang.reflect.Method.invoke(Method.java:511) 11-06 16:13:46.283: E/AndroidRuntime(924): на com.android.internal. os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 11-06 16:13:46.283: E/AndroidRuntime(924): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 11 -06 16:13:46.283: E/AndroidRuntime(924): at dalvik.system.NativeStart.main(собственный метод) 11-06 16:13:46.283: E/AndroidRuntime(924): вызвано: java.lang. NullPointerException 11-06 16:13:46.283: E/AndroidRuntime(924): в com.tcs.mobility.uy.rmg.ManagerListAdapter.(ManagerListAdapter.java:63) 11-06 16:13:46.283: E/AndroidRuntime( 924): в com.tcs.mobility.uy.rmg.ManagerListActivity.onCreate(ManagerListActivity.java:146) 11-06 16:13:46.283: E/AndroidRuntime(924): в android.app.Activity.perf ormCreate(Activity.java:5104) 11-06 16:13:46.283: E/AndroidRuntime(924): в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 11-06 16:13:46.283: E/ AndroidRuntime(924): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 11-06 16:13:46.283: E/AndroidRuntime(924): ... еще 11


person juanzack    schedule 06.11.2013    source источник
comment
Сделал это. До сих пор не работает.   -  person juanzack    schedule 06.11.2013
comment
можете ли вы опубликовать здесь свой лог-кот, попробуйте сохранить точки останова в своем классе адаптера, а затем выполните построчную отладку   -  person SHASHIDHAR MANCHUKONDA    schedule 06.11.2013
comment
проверьте строку номер 63 в вашем классе adpater, сохраните там точку останова   -  person SHASHIDHAR MANCHUKONDA    schedule 06.11.2013
comment
Здорово! Спасибо, теперь все работает, ЗА ИСКЛЮЧЕНИЕМ holder.callImg.setOnClickListener(callListener); callImg — это кнопка, вложенная в родительские элементы. Любые мысли о том, как это исправить? Он работает в другом ListView, и теперь я точно так же реализую его в этом ExpandableListView.   -  person juanzack    schedule 06.11.2013


Ответы (1)


Я предполагаю, что телефон должен быть включен в тег View (точнее, в RowViewHolder)? Безопаснее предположить, что onClickListener зависит только от данных View. В вашем коде значение телефона зависит от того, какой groupView был обновлен последним.

person jmuet    schedule 06.11.2013
comment
Да, хорошее решение, попробую - person juanzack; 07.11.2013