为了账号安全,请及时绑定邮箱和手机立即绑定

应用程序停止工作:单击列表选项时,猜字游戏停止工作

应用程序停止工作:单击列表选项时,猜字游戏停止工作

幕布斯6054654 2021-10-27 16:55:50
我制作了一个应用程序,它从两个文本文件(一个带有单词,另一个带有定义)中获取单词和定义。使用随机数生成要显示的单词,然后将 5 个定义与正确的定义一起随机排列以显示选项。该应用程序运行完美,但当使用列表视图单击任何选项时,该应用程序将停止工作。ArrayList<String> word=new ArrayList<>();List<String> dfn=new ArrayList<>();String que="",ans="";int counter=0;private void random(){    Random num = new Random();    int nw = num.nextInt(word.size());    que = word.get(nw);    ans = dfn.get(nw);    dfn.remove(ans);    Collections.shuffle(dfn);    dfn = dfn.subList(0,4);    dfn.add(ans);    Collections.shuffle(dfn);}TextView t;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_game);    Scanner sc = new Scanner(getResources().openRawResource(R.raw.word2));    Scanner sc2 = new Scanner(getResources().openRawResource(R.raw.def2));    while(sc.hasNextLine()&&sc2.hasNextLine()){        String a = sc.nextLine();        String b = sc2.nextLine();        word.add(a);        dfn.add(b);我想上面的部分很好。    }    sc.close();    sc2.close();    random();    t = (TextView) findViewById(R.id.t);    t.setText(que);    run();}ArrayAdapter<String> adap;public void run(){    ListView list = (ListView) findViewById(R.id.li);    adap = new ArrayAdapter<>(            this,            android.R.layout.simple_list_item_1,            dfn    );    list.setAdapter(adap);    list.setOnItemClickListener((adapterView, view,i,l)->{//lambda expression                if(dfn.get(i).equals(ans)){                    Toast.makeText(getApplicationContext(),"Correct!",Toast.LENGTH_SHORT).show();                    counter++;                }                else{                    Toast.makeText(getApplicationContext(),"Wrong!",Toast.LENGTH_SHORT).show();                }                TextView t2 = (TextView) findViewById(R.id.t2);                t2.setText("Score : "+counter);        random();        t.setText(que);        run();            }    );}}
查看完整描述

1 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我将尝试在没有堆栈跟踪的情况下描述您代码中的明确问题。如果我清楚地看到,主要问题可能是您的 lambda 表达式中的递归代码。这肯定会setOnItemClickListener一次又一次地不必要地调用。并将您的适配器设置为每次run调用中的新适配器。run仅从onCreate方法一次调用方法并删除递归调用运行setOnItemClickListener并将可调用代码移动到分离的方法中。如果您需要在 ListView 中对项目进行排序,则对集合中的数据进行排序,然后调用


@Override

public void notifyDataSetChanged() {

    //do your sorting here


    super.notifyDataSetChanged();

}

从我现在在堆栈跟踪中看到的情况来看,我可以说主要问题出在您的dfn收藏中。你确定这些指标是正确的吗?您的代码意味着word和dfn集合必须具有相同的大小,但显然它们不是。


查看完整回答
反对 回复 2021-10-27
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信