2017-01-10 2 views
1

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.

Antwort

1

Einer der Hauptgründe notifyDataSetChanged() funktioniert nicht für Sie - ist, verliert Ihr Adapter den Verweis auf Ihre Liste. Rufen Sie jemals die Ausnahme testTripletArray = new ... bei der Initialisierung auf? Bitte immer testTripletArray.clear() und dann testTripletArray.addall(theNewObjects).

+0

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

+0

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

+0

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

Verwandte Themen