如何更改 BaseAdapter 中只有一个特定按钮的颜色?

How to change the color of only one specific button in BaseAdapter?

我在我的 BaseAdapter 中遇到了一个问题,我尝试仅为我在其中找到的特定字母更改按钮的颜色,但是当我尝试这样做时,颜色会更改系统中的所有按钮,怎么办?我可以做吗?

更具体地说,在 MainActivity class 中我有两个列表: userAnswer 和 newList。在onCreate()中创建一个class时,我在userAnswer中添加了某些字母A、B、C等。我想在选择 buttonAddLetter 后将下一个字母添加到 userAnswer,只是我想让这些新字母将颜色更改为另一个字母,而不是与其他字母相同。一切正常,但是,问题是所有字母都变成了不同的颜色,尽管在 BaseAdapter 中我检查数据是否来自 newList,如果是,则更改颜色。我究竟做错了什么?为什么所有按钮的颜色都变了?

感谢您的帮助。

GridViewAnswerAdapter.class

public class GridViewAnswerAdapter extends BaseAdapter {

    private List<String> answer;
private Context context;
private MainActivity mainActivity;

public GridViewAnswerAdapter(List<String> answer, Context context, MainActivity mainActivity) {
    this.answer = answer;
    this.context = context;
    this.mainActivity = mainActivity;
}

@Override
public int getCount() {
    return answer.size();
}

@Override
public Object getItem(int position) {
    return answer.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    Button buttonAnswerAdapter = null;

    if (convertView == null) {
        if (answer.get(position).equals(" ")) {

            buttonAnswerAdapter = new Button(context);
            buttonAnswerAdapter.setLayoutParams(new GridView.LayoutParams(100, 100));
            buttonAnswerAdapter.setPadding(8, 8, 8, 8);
            buttonAnswerAdapter.setBackgroundColor(Color.BLUE);

        }

//I want to change color button only where newList add some new letter, //everything is ok, but it's change every button colors, why?

        else if(mainActivity.newList.size() != 0){

            if (mainActivity.newList.get(position).equals(answer.get(position))) {

                buttonAnswerAdapter = new Button(context);
                buttonAnswerAdapter.setLayoutParams(new GridView.LayoutParams(100, 100));
                buttonAnswerAdapter.setPadding(8, 8, 8, 8);
                buttonAnswerAdapter.setBackgroundColor(Color.BLACK);

                buttonAnswerAdapter.setTextColor(Color.RED);


                buttonAnswerAdapter.setText(String.valueOf(mainActivity.newList.get(position)));
            }
        }

        else if(mainActivity.userAnswer.get(position).equals(answer.get(position))) {

            //Create new button
            buttonAnswerAdapter = new Button(context);
            buttonAnswerAdapter.setLayoutParams(new GridView.LayoutParams(100, 100));
            buttonAnswerAdapter.setPadding(8, 8, 8, 8);
            buttonAnswerAdapter.setBackgroundColor(Color.BLUE);


            buttonAnswerAdapter.setTextColor(Color.GREEN);


            buttonAnswerAdapter.setText(String.valueOf(answer.get(position)));

        }
        else
        {
            Toast.makeText(context, "Something is wrong!", Toast.LENGTH_SHORT).show();
        }

    }
        else {
            buttonAnswerAdapter = (Button) convertView;
        }

    return buttonAnswerAdapter;
}

}

MainActivity.class

public class MainActivity extends AppCompatActivity {


List<String> userAnswer = new ArrayList<>();
List<String> newList = new ArrayList<>();

GridViewAnswerAdapter gridViewAnswerAdapter;
GridView gridViewAnswer;

Button buttonAddLetter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    gridViewAnswer = findViewById(R.id.gridViewAnswer);
    buttonAddLetter = findViewById(R.id.buttonWskazówka);


    buttonAddLetter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            addMore();
        }
    });


    userAnswer.add(0, "A");
    userAnswer.add(1, "B");
    userAnswer.add(2, "C");
    userAnswer.add(3, "D");
    userAnswer.add(4, "E");
    userAnswer.add(5, "F");
    userAnswer.add(6, "G");


    gridViewAnswerAdapter = new GridViewAnswerAdapter(userAnswer, getApplicationContext(), MainActivity.this);
    gridViewAnswer.setAdapter(gridViewAnswerAdapter);

    gridViewAnswerAdapter.notifyDataSetChanged();

}

private void addMore()
{

    newList.clear();

    newList.addAll(userAnswer);
    newList.set(0, "A");
    newList.set(1, "B");
    newList.set(2, "C");


    gridViewAnswerAdapter = new GridViewAnswerAdapter(userAnswer, getApplicationContext(), MainActivity.this);
    gridViewAnswer.setAdapter(gridViewAnswerAdapter);

    gridViewAnswerAdapter.notifyDataSetChanged();

}

}

我添加图片是因为我不知道如何完全解释我想要实现的目标:

在一张图片上我有一个带有 6 个按钮的列表视图,在第二张图片上我们有一个按钮列表(新列表,在索引上添加 0,1,2 - A、B、C)不同的颜色。问题是我想获得第三张图片的结果,即当我按下袜子时,我希望新添加的字母具有完全不同的颜色,而那些已经是原来颜色的字母。

enter image description here

enter image description here

enter image description here

我很难理解您想要的结果。如果您想在初始化后更改按钮颜色,请直接存储对按钮适配器或按钮的引用。这样您就可以在运行时访问它并将其更改为您想要的任何内容。

更改 Adapter 构造函数并将 List "newList" 直接传递给 Adapter。传递 Activity 只是为了访问 Activity.

中的某些 class 变量不是一个好主意
private List<String> answer;
private List<String> newList;
private Context context;

public GridViewAnswerAdapter(List<String> answer, List<String> newList, Context context) {
    this.answer = answer;
    this.newList = newList;
    this.context = context;
}

使用你的 MainActivity:

gridViewAnswerAdapter = new GridViewAnswerAdapter(userAnswer, newList, MainActivity.this);

AdaptergetView() 方法更改为:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    Button buttonAnswerAdapter = null;

    if (convertView == null) {
        buttonAnswerAdapter = new Button(context);
        buttonAnswerAdapter.setLayoutParams(new GridView.LayoutParams(100, 100));
        buttonAnswerAdapter.setPadding(8, 8, 8, 8);
        buttonAnswerAdapter.setBackgroundColor(Color.BLUE);
        buttonAnswerAdapter.setTextColor(Color.GREEN);
        buttonAnswerAdapter.setText(answer.get(position));
    }else{
        buttonAnswerAdapter = (Button) convertView;
    }

    if(newList.size() != 0){
        if (newList.get(position).equals(answer.get(position))) {
            buttonAnswerAdapter.setBackgroundColor(Color.BLACK);
            buttonAnswerAdapter.setTextColor(Color.RED);
        }
    }

    return buttonAnswerAdapter;
}

在您的 addMore() 方法中,不需要这样:

gridViewAnswerAdapter = new GridViewAnswerAdapter(userAnswer, getApplicationContext(), MainActivity.this);
gridViewAnswer.setAdapter(gridViewAnswerAdapter);

因为已经设置了Adapter并且已经添加了"newList"。

我通常会为 View 使用我自己的自定义 xml 布局,我会在 ListView 中使用 inflate。但是,如果只是创建一个 Button 适合你..为什么不呢?