亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

應用程序停止工作:單擊列表選項時,猜字游戲停止工作

應用程序停止工作:單擊列表選項時,猜字游戲停止工作

幕布斯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 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號