Ich möchte damit beginnen, dass ich hier keine Ansichten verwende. Ich habe einfach 5 Ansichten und tausche sie mit zwei Auswahlklicks um. Ich habe online einige Fragen durchgesehen und die meisten von ihnen beschäftigen sich mit dem Recycler und getChildAt usw. und es funktioniert einfach nicht für mich.Android-Listenansicht Bearbeiten Alle Ansichtserscheinungen
Ich verstehe, wie Adapter funktionieren sollen, also dachte ich, dass ich meine Hintergrundfarbe in meinen Adapter übergeben müsste. Nur ein kurzer Überblick darüber, was ich hier machen möchte. Der Benutzer kann die Listenelemente mischen und sie müssen der Tabelle daneben entsprechen. Sobald der Benutzer der Meinung ist, dass die Antworten korrekt sind, klicken sie auf den Senden-Button. Zu diesem Zeitpunkt sollten die Hintergrundfarben für richtig und falsch auf grün oder rot wechseln.
Wenn ich jedoch auf alle Ansichten zugreifen möchte, kann ich mich nicht damit abfinden.
meine Datenquelle für den Adapter Erste
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;
}
So eine API Ich bin mit einem Triplet zu verwenden, die ursprünglich war dies ein Paar, aber ich beschlossen, die Farbe Int aufzunehmen.
Bestücken des Adapters
//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);
}
So ist das Standard-Adapter und Listview Haus. Ich gebe meine Daten an den Adapter weiter und gebe dann dem listView meinen Adapter.
Der Adapter
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;
}
Wieder nichts speziell Phantasie mit dem Adapter. Ich habe den Hintergrund der Rahmenbox auskommentiert, weil ich die Farbzuweisung teste. So, wie ich die Hintergrundfarbe hier vom dritten Parameter des Triplets herstellte, dachte ich, dass ich es in der Haupttätigkeit ändern könnte.
Der Versuch, jede Ansicht zu ändern und
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();
Dies ist die Phase mitteilen, an dem ich den Benutzer möchte die Prüfung Antwort-Taste drücken und es durchläuft alle Definitionen und Wörter, um zu sehen, ob sie Spiel. Es basiert auf einem Index, der als das 2. Argument des Triple gesetzt wird.
Ich versuche schließlich, die Hintergrundfarbe int des Triplet mit setAt2 zu ändern und dann die Farbe auszuwählen. Nach der for-Schleife informiere ich den Adapter, dass sich die Information geändert hat. Ich hatte dann gehofft, dass der Adapter die "getView" aktualisieren und das neue Argument im Farbparameter anwenden würde. Leider nichts aktualisiert.
Jeder Rat hier wäre großartig, da ich viele verschiedene Methoden getestet habe, aber ich bin kurz gekommen.
Danke fürs Lesen, ich weiß, es ist eine lange Frage.
Ich habe '= new ArrayList' hinzugefügt, bevor ich die Daten aus meiner Wortliste hinzufüge. Ich habe auch versucht, die Array-Liste zu löschen. Wann würde ich es klären? Ich habe derzeit, basierend auf Ihrem Rat, alle bearbeiteten Elemente zu einer Halter-Triplet-Arraylist hinzugefügt. Nach der for-Schleife habe ich mein testTripletArray gelöscht und dann die Werte aus der Halter-arraylist zu meinem testTripleArray hinzugefügt. Wenn ich versuche, den Farbwert zu lesen, sind sie alle -1. Nicht sicher warum. Ich benachrichtige auch den Adapter nach. HINZUFÜGEN Ihren Vorschlag auf den Grund meiner Frage. – CardDeath
Ihre Bearbeitung ist nicht das, was ich meinte. Ich wollte nur wissen, ob Sie 'testTripletArray = new ...' irgendwo anders in Ihrem Code aufrufen, was wir nicht sehen können. Wenn ja, dann benutze meine Lösung. Ihre Bearbeitung funktioniert nicht, denn wenn Sie das beschriebene Problem wirklich haben, ändern Sie ein anderes Objekt als in Ihrem Adapter. – beeb
Die Bearbeitung wurde entfernt. Dies ist meine Deklaration: 'private ArrayList> testTripletArray = new ArrayList <>();' das ist im globalen Umfang. Meine Initialisierung erfolgt innerhalb der folgenden Funktion mit: 'testTripletArray = wordAndDefinitionList.getDefinitionWordsTriplet();'. Es ist das einzige Mal, dass ich ihm einen Wert zugebe. –
CardDeath