Я хочу начать с того, что я не использую представления здесь. У меня просто 5 просмотров, и я меняю их с помощью двух кликов. Я просмотрел несколько вопросов в Интернете, и большинство из них касается Recycler и getChildAt и т. Д., И это просто не работает для меня.Android List View Редактировать Все view apperance
Я понимаю, как адаптеры предназначены для работы, поэтому я решил, что мне придется передать свой фоновый цвет в мой адаптер. Просто вернемся к тому, что я хочу здесь сделать. Пользователь может перемешать элементы списка вокруг, и они должны соответствовать соседней таблице. Как только пользователь считает, что ответы правильные, они нажали кнопку отправки. В этот момент цвета фона должны измениться на зеленый или красный для правильного и неправильного.
Однако, когда я хочу получить доступ ко всем представлениям, я не могу получить ручку.
Получение моего источника данных для адаптера
private ArrayList<Triplet<String, Integer, Integer>> testArray = new ArrayList<>();
public ArrayList<Triplet<String, Integer, Integer>> getDefinitionWordsTriplet(){
testArray.add(Triplet.with("Trojan", 0, Color.WHITE));
testArray.add(Triplet.with("Virus", 1, Color.WHITE));
testArray.add(Triplet.with("Spyware", 2, Color.WHITE));
testArray.add(Triplet.with("Ransomware", 3, Color.WHITE));
testArray.add(Triplet.with("Leakware", 4, Color.WHITE));
return testArray;
}
Так я использую API, чтобы использовать близнец, первоначально это была пара, но я решил включить цвет Int.
Наполнение адаптер
//TESTING
private ArrayList<Triplet<String, Integer, Integer>> testTripletArray;
private DefintionListViewAdapterTriplet leftTripletAdapter;
private void EstablishTableLists(){
leftDefinitionLV = (ListView) findViewById(R.id.definitionMainGameLeftLV);
ListView rightDefinitionLV = (ListView) findViewById(R.id.definitionMainGameRightLV);
DefinitionWordList wordAndDefinitionList = new DefinitionWordList();
definitionWordsList = wordAndDefinitionList.getDefinitionWords();
definitionExplanationsList = wordAndDefinitionList.getDefinitionExplanations();
tableLength = definitionWordsList.size();
//TESTING
testTripletArray = wordAndDefinitionList.getDefinitionWordsTriplet();
DefintionListViewAdapter rightAdapter = new DefintionListViewAdapter
(DefinitionGameMainActivity.this, definitionExplanationsList);
//TESTING
leftTripletAdapter = new DefintionListViewAdapterTriplet(DefinitionGameMainActivity.this, testTripletArray);
//leftDefinitionLV.setAdapter(leftAdapter);
rightDefinitionLV.setAdapter(rightAdapter);
//TESTING
leftDefinitionLV.setAdapter(leftTripletAdapter);
leftDefinitionLV.setOnItemClickListener(leftSideItemListener);
}
Так это стандартный адаптер и ListView учреждение. Я передаю свои данные адаптеру, а затем даю listView моему адаптеру.
Адаптер
public class DefintionListViewAdapterTriplet extends ArrayAdapter<Triplet<String, Integer, Integer>> {
private Context mContext;
private ArrayList<Triplet<String, Integer, Integer>> mInput;
public DefintionListViewAdapterTriplet(Context c, ArrayList<Triplet<String, Integer, Integer>> input){
super(c, -1, input);
mContext = c;
mInput = input;
Log.i("Test: ", mInput.get(0).getValue0());
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.definition_table_cell, parent, false);
TextView textInputTV = (TextView) rowView.findViewById(R.id.definitionCellTV);
LinearLayout borderColour = (LinearLayout) rowView.findViewById(R.id.definitionBackgroundCell);
borderColour.setBackgroundColor(mInput.get(position).getValue2());
textInputTV.setText(mInput.get(position).getValue0());
/* if(parent.getId() == R.id.definitionTutorialRightTableLV || parent.getId() == R.id.definitionMainGameRightLV){
borderColour.setBackgroundResource(R.drawable.definition_tutorial_box_border_grey);
}else{
}*/
return rowView;
}
Опять ничего специфически фантазии с адаптером. Я прокомментировал фон в поле рамки, потому что я тестирую назначение цвета. Так как я помещал цвет фона здесь из 3-го параметра Триплета, я думал, что смогу изменить его в основном действии.
Попытка изменить каждый вид и уведомить
private void checkAnswerValues(){
for(int i = 0; i < tableLength; i++){
//int leftCell = definitionWordsList.get(i).second;
//TESTING
int leftCell = testTripletArray.get(i).getValue1();
int rightCell = definitionExplanationsList.get(i).second;
//TODO Doesn't work, doesn;t update the colours. No crashing but unsure
//TODO Don't think it's getting the right information, need to think how to access a view.
if(leftCell == rightCell){
Log.i(LOG_TAG, "Match");
correctAnswerCount++;
//TODO CHange border colours in both tables to green
testTripletArray.get(i).setAt2(Color.GREEN);
}else{
Log.i(LOG_TAG, "No Match");
//TODO Change border colours to red
testTripletArray.get(i).setAt2(Color.RED);
}
}
leftTripletAdapter.notifyDataSetChanged();
Это этап, на котором я хочу, чтобы пользователь нажать кнопку проверки ответа и он перебирает все определения и слова, чтобы увидеть, если они совпадение. Он основан на индексе, установленном в качестве второго (1-го, если вы считаете от 0) аргумента Triple.
Наконец-то я попытаюсь изменить цвет фона int триплета с помощью setAt2 и затем выбрать цвет. После цикла for я уведомляю адаптер об изменении информации. Тогда я надеялся, что адаптер обновит «getView» и применит новый аргумент, найденный в цветовом параметре. К сожалению, ничего не обновляется.
Любой совет здесь был бы замечательным, поскольку я тестировал множество методов разницы, но я пришел в себя.
Спасибо за чтение, я знаю, что это долгий вопрос.
Я добавил '= новый ArrayList' перед добавлением данных из списка слов. Также я попытался очистить список массивов. Когда я его очищу? В настоящее время я, основываясь на ваших советах, добавил все отредактированные элементы в держатель триплетного arraylist. После цикла for я очистил свой testTripletArray, а затем добавил значения от держателя-держателя к моему testTripleArray. Однако, когда я пытаюсь прочитать значение цвета, все они равны -1. Не знаю, почему. Я также уведомляю адаптер после. ДОБАВЛЕНО ваше предложение до конца моего вопроса. – CardDeath
Ваше изменение не то, что я имел в виду. Я просто хотел знать, если вы когда-либо называете 'testTripletArray = new ...' где-то еще в своем коде, который мы не могли видеть. Если да, то используйте мое решение. Ваше редактирование не работает, потому что если у вас действительно есть проблема, которую я описал, вы изменяете другой объект, чем в своем адаптере. – beeb
Удалено изменение. Это мое объявление: 'private ArrayList> testTripletArray = new ArrayList <>();' который находится в глобальной области. Моя инициализация происходит внутри функции ниже: 'testTripletArray = wordAndDefinitionList.getDefinitionWordsTriplet();'. Это единственный раз, когда я присваиваю ему значение. –
CardDeath