如何更改 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);
将 Adapter
的 getView()
方法更改为:
@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
适合你..为什么不呢?
我在我的 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
.
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);
将 Adapter
的 getView()
方法更改为:
@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
适合你..为什么不呢?