程序奔溃问题

正在回答

登陆购买课程后可参与讨论,去登陆

11回答

http://img1.sycdn.imooc.com//climg/5aa772740001719505420386.jpg

这里没有改过来丫,我的意思是红框的都去掉

  • 慕UI6705487 提问者 #1
    非常感谢!
    2018-03-13 18:58:18
提问者 慕UI6705487 2018-03-13 14:23:22
package com.hala.view01;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by air on 2018/3/6.
 */

public class LocalData {

    /**
     * 获取列表组的数据
     * @return
     */
    public static List<String> getGroupData(){
        List<String> groups=new ArrayList<String>();
        groups.add("权利的游戏第一季");
        groups.add("权利的游戏第二季");
        return groups;
    }

    /**
     * 获取子条目的数据
     * @return
     */
    public static List<List<String>> getChildData(){
        List<List<String>> childs= new ArrayList<List<String>>() {
            @Override
            public int size() {
                return 0;
            }

            @Override
            public List<String> get(int index) {
                return null;
            }
        };

        List<String> item1=new ArrayList<String>();
        item1.add("龙的诞生");
        item1.add("耐得史塔克之死");
        childs.add(item1);

        List<String> item2=new ArrayList<String>();
        item1.add("红袍女的出现");
        item1.add("少狼主起兵");
        item2.add("弑君者被抓");

        childs.add(item2);
        return childs;
    }
}


提问者 慕UI6705487 2018-03-12 20:15:30
  • 适配器看没什么问题,你把getChildData()方法和getGroupData()代码贴出来
    2018-03-13 09:38:20
  • 提问者 慕UI6705487 回复 irista23 #2
    在上边了老师
    2018-03-13 14:22:48
提问者 慕UI6705487 2018-03-12 16:47:36

http://img1.sycdn.imooc.com//climg/5aa63e960001867113070262.jpg

空指针报错

提问者 慕UI6705487 2018-03-12 16:46:19
package com.hala.view01;

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

import java.util.List;

/** 基础适配器
 * Created by air on 2018/3/6.
 */

public abstract class MyBaseAdapter<T> extends BaseExpandableListAdapter {

    private List<String> groups;
    private List<List<T>> childs;
    Context mcontext;
    LayoutInflater mlayoutInflater;

    public MyBaseAdapter(Context context){
        mcontext=context;
        mlayoutInflater=LayoutInflater.from(mcontext);

    }


    public void addNewData(List<String> groups,List<List<T>> childs){
        this.groups=groups;
        this.childs=childs;

    }


    /**
     * 获取组的数量
     * @return
     */
    @Override
    public int getGroupCount() {
        return groups.size();
    }

    /**
     * 获取组的id
     * @param groupPosition 组的位置
     * @return
     */
    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }

    /**
     * 获取组的视图
     * @param groupPosition 组的位置
     * @param isExpanded 组是否是展开的
     * @param convertView 视图
     * @param parent 环境
     * @return
     */
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        return MyGroupView(groupPosition,convertView);
    }

    /**
     * 获取组的具体内容
     * @param groupPosition 组的位置
     * @return
     */
    @Override
    public String getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }

    /**
     * 获取组的子条目数量
     * @param groupPosition 组的位置
     * @return
     */
    @Override
    public int getChildrenCount(int groupPosition) {
        return childs.get(groupPosition).size();
    }

    /**
     * 获取具体子条目的内容
     * @param groupPosition 组的位置
     * @param childPosition 子条目在组中的位置
     * @return
     */
    @Override
    public T getChild(int groupPosition, int childPosition) {
        return childs.get(groupPosition).get(childPosition);
    }


    /**
     * 获取子条目的位置
     * @param groupPosition 组的位置
     * @param childPosition 子条目在组中的位置
     * @return
     */
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }

    /**
     * 获取子条目的视图
     * @param groupPosition 组的位置
     * @param childPosition 子条目在组中的位置
     * @param isLastChild 是否是最后一个子条目
     * @param convertView 视图
     * @param parent 环境
     * @return
     */
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        return MyChildView(groupPosition,childPosition,convertView);
    }

    public abstract View MyGroupView(int groupPosition,View groupview);
    public abstract View MyChildView(int groupPosition,int childPosition,View childview);

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


    /**
     * 子条目是否可以被点击
     * @param groupPosition
     * @param childPosition
     * @return
     */
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

MyBaseAdapter类,添加了范型

package com.hala.view01;

import android.content.Context;
import android.view.View;
import android.widget.TextView;

/** 本地数据适配器
 * Created by air on 2018/3/6.
 */

public class LocalAdapter extends MyBaseAdapter {

    public LocalAdapter(Context context) {
        super(context);
    }

    @Override
    public View MyGroupView(int groupPosition, View groupview) {
        View view=mlayoutInflater.inflate(R.layout.item_elv_group,null);
        TextView txttTitle=(TextView) view.findViewById(R.id.txt_group);
        txttTitle.setText(getGroup(groupPosition));
        txttTitle.setPadding(30,0,0,0);
        //设置内边距,据左边为30dp
        return view;
    }

    @Override
    public View MyChildView(int groupPosition, int childPosition, View childview) {
        View view=mlayoutInflater.inflate(R.layout.item_elv_child,null);
//        TextView txtContent=(TextView)view.findViewById(R.id.txt_child);
//        txtContent.setText(getChild(groupPosition,childPosition));
//        txtContent.setPadding(30,0,0,0);
        return view;
    }
}

LocalAdapter类,将最后三行注释掉了

  • txtContent.setText(getChild(groupPosition,childPosition));这句把参数使用.toString()转成String
    2018-03-12 17:16:30
  • 提问者 慕UI6705487 回复 irista23 #2
    老师,还是一样的错误呀,见上边回复报错
    2018-03-12 20:14:25
提问者 慕UI6705487 2018-03-09 19:12:32
/**
 * 获取具体子条目的内容
 * @param groupPosition 组的位置
 * @param childPosition 子条目在组中的位置
 * @return
 */
@Override
public String getChild(int groupPosition, int childPosition) {
    return childs.get(groupPosition).get(childPosition);
}

MyBaseAdapter类中的问题代码段

http://img1.sycdn.imooc.com//climg/5aa26c0e00012ee413330262.jpg

报错内容

  • 提问者 慕UI6705487 #1
    错了错了,问题代码段是下边这个 /** * 获取组的子条目数量 * @param groupPosition 组的位置 * @return */ @Override public int getChildrenCount(int groupPosition) { return childs.get(groupPosition).size(); }
    2018-03-09 19:13:57
irista23 2018-03-09 13:36:56

http://img1.sycdn.imooc.com//climg/5aa21d650001f7a905470399.jpg

改成List<List<String>> childs = new ArrayList<List<String>>();

  • 提问者 慕UI6705487 #1
    谢谢老师这个问题解决了,但我点击第一级按钮没有出现下拉菜单,而是崩溃啦,报错是空指针异常(见上边回复,还有问题代码段),我又看了一遍视频,和视频代码是一样的,不知哪里的问题
    2018-03-09 19:11:22
  • irista23 回复 提问者 慕UI6705487 #2
    你参照源码把MyBaseAdapter加上范型,因为它是基类,加上范型扩展性更大,对应的childs改成List<List<T>> 类型,getChild()返回T类型。
    2018-03-11 09:26:42
  • 提问者 慕UI6705487 回复 irista23 #3
    老师,改了之后,还有一个空指针异常,见上边最新回复
    2018-03-12 16:44:11
提问者 慕UI6705487 2018-03-08 21:39:50

LocalAdapter类

package com.hala.view01;

import android.content.Context;
import android.view.View;
import android.widget.TextView;

/** 本地数据适配器
 * Created by air on 2018/3/6.
 */

public class LocalAdapter extends MyBaseAdapter {

    public LocalAdapter(Context context) {
        super(context);
    }

    @Override
    public View MyGroupView(int groupPosition, View groupview) {
        View view=mlayoutInflater.inflate(R.layout.item_elv_group,null);
        TextView txttTitle=(TextView) view.findViewById(R.id.txt_group);
        txttTitle.setText(getGroup(groupPosition));
        txttTitle.setPadding(30,0,0,0);
        //设置内边距,据左边为30dp
        return view;
    }

    @Override
    public View MyChildView(int groupPosition, int childPosition, View childview) {
        View view=mlayoutInflater.inflate(R.layout.item_elv_child,null);
        TextView txtContent=(TextView)view.findViewById(R.id.txt_child);
        txtContent.setText(getChild(groupPosition,childPosition));
        txtContent.setPadding(30,0,0,0);
        return view;
    }
}

主页面java文件

package com.hala.view01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

public class Main2Activity extends AppCompatActivity {

    private ExpandableListView expandableListView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        expandableListView=(ExpandableListView)findViewById(R.id.elv);
        loadLocal();

        expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            /**
             *组的点击事件
             * @param parent 即expandableListView
             * @param v 即Groupview
             * @param groupPosition 组的位置
             * @param id
             * @return
             */
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                Toast.makeText(Main2Activity.this, "你点击的是:"+LocalData.getGroupData().get(groupPosition), Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            /**
             * 子条目的点击事件
             * @param parent 即expandableListView
             * @param v 即Groupview
             * @param groupPosition 组的位置
             * @param childPosition 子条目的位置
             * @param id
             * @return
             */
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Toast.makeText(Main2Activity.this, "你点击的是:"+LocalData.getChildData().get(childPosition), Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }

    //加载本地数据
    public void loadLocal(){
        LocalAdapter adapter=new LocalAdapter(this);
        //添加数据
        adapter.addNewData(LocalData.getGroupData(),LocalData.getChildData());
        expandableListView.setAdapter(adapter);
    }
}


  • 你把groups.add("权利的游戏第二季");这行代码注释掉
    2018-03-09 10:03:04
  • 提问者 慕UI6705487 回复 irista23 #2
    还是一样的结果
    2018-03-09 11:41:24
提问者 慕UI6705487 2018-03-08 21:38:10

LocalData类

package com.hala.view01;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by air on 2018/3/6.
 */

public class LocalData {

    /**
     * 获取列表组的数据
     * @return
     */
    public static List<String> getGroupData(){
        List<String> groups=new ArrayList<String>();
        groups.add("权利的游戏第一季");
        groups.add("权利的游戏第二季");
        return groups;
    }

    /**
     * 获取子条目的数据
     * @return
     */
    public static List<List<String>> getChildData(){
        List<List<String>> childs= new AbstractList<List<String>>() {
            @Override
            public int size() {
                return 0;
            }

            @Override
            public List<String> get(int index) {
                return null;
            }
        };

        List<String> item1=new ArrayList<String>();
        item1.add("龙的诞生");
        item1.add("耐得史塔克之死");
        childs.add(item1);

        List<String> item2=new ArrayList<String>();
        item1.add("红袍女的出现");
        item1.add("少狼主起兵");
        item2.add("弑君者被抓");

        childs.add(item2);
        return childs;
    }
}

MyBaseAdapter类

package com.hala.view01;

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

import java.util.List;

/** 基础适配器
 * Created by air on 2018/3/6.
 */

public abstract class MyBaseAdapter extends BaseExpandableListAdapter {

    private List<String> groups;
    private List<List<String>> childs;
    Context mcontext;
    LayoutInflater mlayoutInflater;

    public MyBaseAdapter(Context context){
        mcontext=context;
        mlayoutInflater=LayoutInflater.from(mcontext);

    }


    public void addNewData(List<String> groups,List<List<String>> childs){
        this.groups=groups;
        this.childs=childs;

    }


    /**
     * 获取组的数量
     * @return
     */
    @Override
    public int getGroupCount() {
        return groups.size();
    }

    /**
     * 获取组的id
     * @param groupPosition 组的位置
     * @return
     */
    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }

    /**
     * 获取组的视图
     * @param groupPosition 组的位置
     * @param isExpanded 组是否是展开的
     * @param convertView 视图
     * @param parent 环境
     * @return
     */
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        return MyGroupView(groupPosition,convertView);
    }

    /**
     * 获取组的具体内容
     * @param groupPosition 组的位置
     * @return
     */
    @Override
    public String getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }

    /**
     * 获取组的子条目数量
     * @param groupPosition 组的位置
     * @return
     */
    @Override
    public int getChildrenCount(int groupPosition) {
        return childs.get(groupPosition).size();
    }

    /**
     * 获取具体子条目的内容
     * @param groupPosition 组的位置
     * @param childPosition 子条目在组中的位置
     * @return
     */
    @Override
    public String getChild(int groupPosition, int childPosition) {
        return childs.get(groupPosition).get(childPosition);
    }


    /**
     * 获取子条目的位置
     * @param groupPosition 组的位置
     * @param childPosition 子条目在组中的位置
     * @return
     */
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }

    /**
     * 获取子条目的视图
     * @param groupPosition 组的位置
     * @param childPosition 子条目在组中的位置
     * @param isLastChild 是否是最后一个子条目
     * @param convertView 视图
     * @param parent 环境
     * @return
     */
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        return MyChildView(groupPosition,childPosition,convertView);
    }

    public abstract View MyGroupView(int groupPosition,View groupview);
    public abstract View MyChildView(int groupPosition,int childPosition,View childview);

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


    /**
     * 子条目是否可以被点击
     * @param groupPosition
     * @param childPosition
     * @return
     */
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}


irista23 2018-03-08 09:24:56

你报的这个错误提示是容器的操作不被允许,你代码中用到ArrayList等容器集合了吗?断点跟踪一下集合操作的代码,如果还是没有发现问题,把相关代码贴出来,方便我们帮你找到问题解决。

  • 提问者 慕UI6705487 #1
    老师请看一下上边回复的代码,还是没找出来
    2018-03-08 21:40:44
Tender10 2018-03-07 11:06:13

你是导入的课程源码嘛,还是自己新建的工程。

  • 提问者 慕UI6705487 #1
    自己写的工程
    2018-03-07 16:19:41
  • Tender10 回复 提问者 慕UI6705487 #2
    这个是你刚创建工程运行就报错,还是写了自己的有关代码之后报错的。如果新建了Activity,检查一下是否在Manifest文件中进行了注册。
    2018-03-07 16:25:46
  • 提问者 慕UI6705487 回复 Tender10 #3
    注册了,如果没有注册它会显示前一个activity的界面,现在一进去就会崩溃
    2018-03-07 21:54:17
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师