Java 如何在GridView中洗牌TextView元素?

Java 如何在GridView中洗牌TextView元素?,java,android,gridview,android-studio,Java,Android,Gridview,Android Studio,我正在尝试制作一个随机按钮,它将随机重新排列GridView中的TextView项目(简单的字母)。我试图简单地复制元素列表,Collections.shuffle()it,然后在GridView中循环实际元素并将新特性应用于它们。然而,当我这样做时,在两次或三次按下之后,所有的字母和特征都是相同的 @Override public void onCreate(Bundle savedInstanceState) { private static final Stri

我正在尝试制作一个随机按钮,它将随机重新排列GridView中的TextView项目(简单的字母)。我试图简单地复制元素列表,
Collections.shuffle()
it,然后在GridView中循环实际元素并将新特性应用于它们。然而,当我这样做时,在两次或三次按下之后,所有的字母和特征都是相同的

 @Override
    public void onCreate(Bundle savedInstanceState) {

        private static final String[] LETTERSET = generateLetterset.main();
        gridView = (GridView) findViewById(R.id.lettersGrid);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                R.layout.letter_text_view_item, LETTERSET);
    gridView.setAdapter(adapter);


 public void Shuffle(View v) {
        gridView = (GridView) findViewById(R.id.lettersGrid);
        List<TextView>letterList = new ArrayList<>();

        for (int i = 0; i < gridView.getChildCount(); i++) {
            TextView letter = (TextView) gridView.getChildAt(i);
            letterList.add(letter);
        }

        Collections.shuffle(letterList);


        for (int i = 0; i < gridView.getChildCount(); i++) {
            TextView currentLetter = (TextView) gridView.getChildAt(i);
            TextView newLetter = letterList.get(i);

            String txt = newLetter.getText().toString();
            boolean selected = newLetter.isClickable();
            int color = newLetter.getCurrentTextColor();

            currentLetter.setText(txt);
            currentLetter.setClickable(selected);
            currentLetter.setTextColor(color);
        }
    }
@覆盖
创建时的公共void(Bundle savedInstanceState){
私有静态最终字符串[]LETTERSET=generateLetterset.main();
gridView=(gridView)findViewById(R.id.lettersGrid);
ArrayAdapter=新的ArrayAdapter(此,
R.布局、字母、文字、视图、项目、字母集);
setAdapter(适配器);
公开无效洗牌(视图五){
gridView=(gridView)findViewById(R.id.lettersGrid);
ListletterList=新的ArrayList();
对于(int i=0;i
尝试下面的代码。 *在oncreate外部声明适配器对象

    private static final String[] LETTERSET = generateLetterset.main();
    public ArrayAdapter<String> adapter;
    private ArrayList<String> stringList;

    public void onCreate(Bundle savedInstanceState) {
        gridView = (GridView) findViewById(R.id.lettersGrid);

        stringList = new ArrayList<String>(Arrays.asList(LETTERSET ));
        adapter = new ArrayAdapter<String>(this,R.layout.letter_text_view_item, stringList );
        gridView.setAdapter(adapter);
    }

与任何其他AdapterView中一样…洗牌适配器的基线数据并通知AdapterView有关更改在第一个for循环后,您将完全删除所有GridView元素,然后洗牌列表,然后再次将它们添加到GridView中,您可以尝试。Selvin,您可以详细介绍一下实现吗?感谢我当前的代码如果使用它,我的问题是在何处以及如何使用GridView实现它是的,奇怪的是,每次洗牌后列表都会变得更同质。例如,如果列表是[a,b,c,d,e,f,g],它会变成类似于[f,c,c,a,c,a,b]然后[a,b,c,c,c],然后[c,c,c,c,]您能否将最初设置数据的代码发布到gridviewupdated my Response中。我希望这能解决您的问题。如果数据已更改,notifyDataSetChanged()将刷新视图。这感觉很接近,但不起作用。我认为notifyDataSetChanged()不起作用,因为letterList()不是适配器的一部分,只是创建了一个新列表,用于镜像适配器中的数据
public void Shuffle(View v) { 
    Collections.shuffle(stringList); 
    adapter.notifyDataSetChanged();
}