2017-01-10 3 views
1

Я хочу начать с того, что я не использую представления здесь. У меня просто 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» и применит новый аргумент, найденный в цветовом параметре. К сожалению, ничего не обновляется.

Любой совет здесь был бы замечательным, поскольку я тестировал множество методов разницы, но я пришел в себя.

Спасибо за чтение, я знаю, что это долгий вопрос.

ответ

1

Одна из основных причин, по которой notifyDataSetChanged() не будет работать для вас - это ваш адаптер теряет ссылку на ваш список. Вы когда-нибудь вызывали testTripletArray = new ... исключение при инициализации? Пожалуйста, всегда делайте testTripletArray.clear(), а затем testTripletArray.addall(theNewObjects).

+0

Я добавил '= новый ArrayList' перед добавлением данных из списка слов. Также я попытался очистить список массивов. Когда я его очищу? В настоящее время я, основываясь на ваших советах, добавил все отредактированные элементы в держатель триплетного arraylist. После цикла for я очистил свой testTripletArray, а затем добавил значения от держателя-держателя к моему testTripleArray. Однако, когда я пытаюсь прочитать значение цвета, все они равны -1. Не знаю, почему. Я также уведомляю адаптер после. ДОБАВЛЕНО ваше предложение до конца моего вопроса. – CardDeath

+0

Ваше изменение не то, что я имел в виду. Я просто хотел знать, если вы когда-либо называете 'testTripletArray = new ...' где-то еще в своем коде, который мы не могли видеть. Если да, то используйте мое решение. Ваше редактирование не работает, потому что если у вас действительно есть проблема, которую я описал, вы изменяете другой объект, чем в своем адаптере. – beeb

+0

Удалено изменение. Это мое объявление: 'private ArrayList > testTripletArray = new ArrayList <>();' который находится в глобальной области. Моя инициализация происходит внутри функции ниже: 'testTripletArray = wordAndDefinitionList.getDefinitionWordsTriplet();'. Это единственный раз, когда я присваиваю ему значение. – CardDeath