Как изменить цвет только одной определенной кнопки в BaseAdapter? - PullRequest
0 голосов
/ 31 декабря 2018

У меня проблема именно в моем BaseAdapter. Я пытаюсь изменить цвет кнопки только для определенных букв, которые я нахожу в них, но когда я пытаюсь это сделать, цвет меняет все кнопки в системе, что я могу сделатьdo?

Более конкретно, в классе MainActivity у меня есть два списка: userAnswer и newList.При создании класса в onCreate () я добавляю определенные ответы A, B, C и т. Д. Пользователю.и я хотел бы добавить следующие буквы в userAnswer после выбора buttonAddLetter, только я хочу, чтобы эти новые буквы меняли цвет на другой, а не на другой.Все работает, однако проблема в том, что все буквы меняются на разные цвета, хотя в 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();

}

}

Я добавляю картинки, потому что я не знаю, как полностью объяснить, чего я хотел бы достичь:

На 1 изображении у меня есть представление списка с 6 кнопками, наНа втором рисунке у нас есть список (новый список, который добавляет 0,1,2 - A, B, C на указатель) кнопок только другого цвета.Проблема в том, что я хотел бы добиться результата от 3-го изображения, то есть, когда я нажимаю на носок, я хочу, чтобы вновь добавленные буквы имели совершенно другой цвет и те, которые уже были в том цвете, который был.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Измените ваш 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);

Измените getView() метод вашего Adapter на этот:

@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" уже добавлен.

Я обычно использовал бы свой собственный XML-макет для View, который я бы inflate в своемListView.Но если просто создание Button работает для вас .. почему бы и нет?

0 голосов
/ 31 декабря 2018

Мне очень тяжело понять, какой ты желаемый результат.Если вы хотите изменить цвет кнопки после инициализации, сохраните ссылку на адаптер кнопки или кнопку напрямую.Таким образом, вы можете просто получить к нему доступ во время выполнения и изменить его на любое другое.

...