Java 如何在BaseAdapter中仅更改一个特定按钮的颜色?

Java 如何在BaseAdapter中仅更改一个特定按钮的颜色?,java,android,adapter,android-button,baseadapter,Java,Android,Adapter,Android Button,Baseadapter,我有一个问题,即在我的BaseAdapter中,我尝试只为我在其中找到的特定字母更改按钮的颜色,但当我尝试这样做时,颜色会更改系统中的所有按钮,我能做什么 更具体地说,在MainActivity类中,我有两个列表: userAnswer和newList。在onCreate()中创建类时,我将某些字母a、B、C等添加到userAnswer中。在选择buttonAddLetter之后,我想向userAnswer添加下一个字母,只是我想让这些新字母的颜色变为另一个,而不是与其他字母的颜色相同。一切正常

我有一个问题,即在我的BaseAdapter中,我尝试只为我在其中找到的特定字母更改按钮的颜色,但当我尝试这样做时,颜色会更改系统中的所有按钮,我能做什么

更具体地说,在MainActivity类中,我有两个列表: userAnswer和newList。在onCreate()中创建类时,我将某些字母a、B、C等添加到userAnswer中。在选择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;
}
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();

}
公共类GridViewAnswerAdapter扩展了BaseAdapter{
私人列表答案;
私人语境;
私人活动;
公共GridViewAnswerAdapter(列表答案、上下文上下文、MainActivity MainActivity){
这个答案=答案;
this.context=上下文;
this.mainActivity=mainActivity;
}
@凌驾
public int getCount(){
返回答案。size();
}
@凌驾
公共对象getItem(int位置){
返回答案。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
按钮适配器=空;
if(convertView==null){
if(answer.get(position).equals(“”){
buttonAnswerAdapter=新按钮(上下文);
buttonAnswerAdapter.setLayoutParams(新的GridView.LayoutParams(100100));
设置填充(8,8,8,8);
按钮。设置背景颜色(颜色。蓝色);
}
//我只想在newList添加一些新字母的地方更改按钮的颜色,//一切正常,但更改每个按钮的颜色,为什么?
else if(mainActivity.newList.size()!=0){
if(mainActivity.newList.get(position).equals(answer.get(position))){
buttonAnswerAdapter=新按钮(上下文);
buttonAnswerAdapter.setLayoutParams(新的GridView.LayoutParams(100100));
设置填充(8,8,8,8);
按钮。设置背景颜色(颜色。黑色);
buttonAnswerAdapter.setTextColor(颜色:红色);
buttonAnswerAdapter.setText(String.valueOf(mainActivity.newList.get(position));
}
}
else if(mainActivity.userAnswer.get(position).equals(answer.get(position))){
//创建新按钮
buttonAnswerAdapter=新按钮(上下文);
buttonAnswerAdapter.setLayoutParams(新的GridView.LayoutParams(100100));
设置填充(8,8,8,8);
按钮。设置背景颜色(颜色。蓝色);
ButtonSwerAdapter.setTextColor(Color.GREEN);
buttonAnswerAdapter.setText(String.valueOf(answer.get(position));
}
其他的
{
Toast.makeText(上下文,“有什么不对劲!”,Toast.LENGTH_SHORT.show();
}
}
否则{
ButtonSwerAdapter=(按钮)convertView;
}
返回按钮和适配器;
}
}

MainActivity.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;
}
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();

}
public类MainActivity扩展了AppCompatActivity{
List userAnswer=new ArrayList();
List newList=newarraylist();
GridViewAnswerAdapter GridViewAnswerAdapter;
GridView gridViewAnswer;
按钮按钮;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridViewAnswer=findViewById(R.id.gridViewAnswer);
buttonAddLetter=findViewById(R.id.buttonWskazówka);
buttonAddLetter.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
addMore();
}
});
添加(0,“A”);
用户应答。添加(1,“B”);
添加(2,“C”);
添加(3,“D”);
添加(4,“E”);
用户应答。添加(5,“F”);
添加(6,“G”);
gridViewAnswerAdapter=新的gridViewAnswerAdapter(userAnswer,getApplicationContext(),MainActivity.this);
setAdapter(gridViewAnswerAdapter);
gridViewAnswerAdapter.notifyDataSetChanged();
}
私有void addMore()
{
newList.clear();
addAll(userAnswer);
newList.set(0,“A”);
新列表。集合(1,“B”);
新列表。集合(2,“C”);
gridViewAnswerAdapter=新的gridViewAnswerAdapter(userAnswer,getApplicationContext(),MainActivity.this);
setAdapter(gridViewAnswerAdapter);
gridViewAnswerAdapter.notifyDataSetChanged();
}
}

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

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


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

更改
适配器
构造函数,并将
列表
新列表直接传递给
适配器
。这不是一个好主意
@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;
}
gridViewAnswerAdapter = new GridViewAnswerAdapter(userAnswer, getApplicationContext(), MainActivity.this);
gridViewAnswer.setAdapter(gridViewAnswerAdapter);