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

时间:2018-10-04 05:46:20

标签: java android listview arraylist

我制作了一个应用程序,该应用程序从两个文本文件中获取单词和定义(一个带有单词,另一个带有定义)。随机数用于生成要显示的单词,然后随机排列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;
@Override
protected 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();
            }

    );

}


}

堆栈跟踪: 致命异常:主要                                                                                流程:com.example.ankitrath.wordguess,PID:2769                                                                                java.lang.IndexOutOfBoundsException:索引:264,大小:5                                                                                    在java.util.ArrayList $ SubList.get(ArrayList.java:1049)                                                                                    在com.example.ankitrath.wordguess.GameActivity.random(GameActivity.java:27)

 ans = dfn.get(nw);

1 个答案:

答案 0 :(得分:0)

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

@Override
public void notifyDataSetChanged() {
    //do your sorting here

    super.notifyDataSetChanged();
}

根据我现在在stacktrace中看到的内容,我可以说主要问题出在您的dfn集合中。您确定这些指标正确吗?您的代码意味着worddfn集合必须具有相同的大小,但显然它们不是相同的。