【问题标题】:App Stops Working : Word Guess game stops working when clicking the list options应用程序停止工作:单击列表选项时猜词游戏停止工作
【发布时间】:2019-03-09 10:30:08
【问题描述】:

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

【问题讨论】:

  • 发布堆栈跟踪
  • 什么是 t2 ?它在列表视图里面吗?
  • 刚刚修复了日志猫并在帖子中添加了堆栈跟踪
  • t2 用于显示分数

标签: java android listview arraylist


【解决方案1】:

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

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

    super.notifyDataSetChanged();
}

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

【讨论】:

  • 好的,我正在尝试这个 :) 堆栈跟踪现在在底部可用
  • 所以问题出在洗牌上,两者都有相同的索引,但洗牌后情况并非如此。 ans 变量应该在洗牌之前得到随机的dfn ,但它先洗牌,然后分配ans。所以我创建了该列表的副本并将其用于ans
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多