.setBackgroundColor Problem

  • 11 Antworten
  • Letztes Antwortdatum
S

sugg1

Neues Mitglied
0
Hallo,
ich habe in meiner App eine Activity mit einer Liste von ListFragments.

Wenn ich mir nun per
text = (String) ((TextView)view).getText().toString()
den String hole funktioniert das einwandfrei.

Wenn ich aber die Hintergrundfarbe ändern möchte, indem ich ein Element auswähle, wird beim runterscrollen ca. jedes 10. Feld farbig markiert. (Das entspricht genau der Höhe meines Displays) In einem anderen Tab mit weniger Elementen passiert das nicht.

Mit diesem Befehl ändere ich die Hintergrundfarbe:
((TextView)view).setBackgroundColor(Color.rgb(202,255,112));


Ich denke das hat irgend etwas mit dem view zutun? Kann jemand helfen?:confused2:
 
Das liegt daran, dass die Views wiederverwendet werden.
Wenn du einmal die Farbe benutzt hast hat dieses Listen Element immer diese Farbe.
Bis du wieder eine andere setzt.

Du musst also die Farbe wieder zurück setzen.
 
Ich glaub du hast mich falsch verstanden:

Ich markiere 1 Listenelement farbig, aber es werden stattdessen 4 Elemente farbig markiert. Das ist dann immer genau das Element, welches 1 Displayhöhe vom anderen entfernt ist.
 
Könntest du dein code und dein xml zeigen?
 
Das wäre zuviel Code ^^

Ich versuche mal das Problem mit Möglichst wenig Quellcode zu beschreiben:

Ich habe hier eine ListFragment Klasse, die verschiedene Strings anzeigt.

Wenn ich nun den jeweiligen String des geklickten Items abfrage bekomme ich ihn und auch nur diesen.

Wenn ich die Hintergrundfarbe ändere bekommt ca. jedes 9. Element diese Hintergrundfarbe (Genau eine Displayhöhe Abstand zwischen den Elementen)


Warum bzw. wie kann ich die Hintergrundfarbe eines einzelnes Elements verändern?

Code:
public class MyListFragment extends ListFragment implements AdapterView.OnItemClickListener {
    
...
    
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
    {
        //Toast.makeText(getActivity(), "Item " +i, Toast.LENGTH_SHORT).show();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        // Create and show the dialog.
        MyDialog newFragment = new MyDialog ();
        newFragment.show(ft, "dialog");
      
      [COLOR=Orange][B] text = (String) ((TextView)view).getText().toString();[/B][/COLOR]

       [COLOR=Blue][B]((TextView)view).setBackgroundColor(Color.rgb(202,255,112));[/B][/COLOR]
    
      
    }

Ich denke mehr Quellcode braucht man an dieser Stelle nicht, um den Fehler zu finden :smile:
 
Ich meine immer noch dass das genau dein Problem ist.
Mit einer Displayhöhe Abstand meinst du ein Item das erst nach dem Scrollen zu sehen ist oder?
Das heißt du kannst die Liste so scrollen das nur eines zu sehen ist oder?

Genau das meine ich mit wiederverwenden.
Wenn in der Liste 10 Einträge sind, dann gibt es genau 10 Views die angezeigt werden, scrollst du jetzt runter wird kein neues Element dahin gesetzt, sondern das Element 1 wird an die 11. Stelle gesetzt. Es wird nur der Inhalt geändert den du explizit angibst.
Wenn du jetzt das erste Element eingefärbt hast, dann wird beim scrollen das 11. Element auch die gleiche Farbe haben, weil exakt die selbe View du du vorher verändert hast dort angezeigt wird.

Du müsstest im Adapter die Farbe wieder zurück setzen, ausser für genau das Element das markiert sein soll, dafür musst du dir dessen position merken.
Wenn du im Adapter dann genau dieses Element wieder hast, musst du die Farbe wieder setzen.

Oder ich komplett daneben, aber wenn mich nicht alles täuscht funktioniert die Liste in Android so um Resourcen zu sparen.
So braucht eine Liste mit 10.000 Einträgen trotzdem nur 10 Views und keine 10.000 was bei vielen Geräten vermutlich den RAM sprengen würde.
 
Ja genau das erste Item, das nach dem Scrollen zu sehen ist hat auch eine andere Farbe.

Das hört sich für mich alles ganz logisch an, aber wie soll ich in diesem Fall einzelne Positionen "zurückfärben" ?

mit int i wird mir zwar die geklickte Position mitgegeben und ich könnte sagen dass jedes Item (i + 10) wieder zurückgefärbt werden soll. Aber wie?

Vielleicht kann man auch irgendwie sagen, dass nur der aktuelle View geändert werden soll?
 
Es gibt keine "nur aktuelle" View es gibt nämlich nur genau 10 Views in deiner Liste.
Du musst doch irgendwo einen Adapter haben der eine getView Funktion hat.
Die ist normalerweise für den Inhalt des Listenelements zuständig.

Dort hast du auch die Position innerhalb der Liste.
Jetzt gehst du hin und guckst ob das aktuelle Item das ausgewählte ist und wenn NICHT nimmst du die Hintergrundfarbe wieder weg bzw machst den Standard wieder hin.

Position merken kannst du dir in der OnItemClick Methode du bekommst ja die angeklickte position übergeben (bei dir i, normalerweise heißt der parameter auch position).
merken und in der getView Methode prüfen eigentlich ganz einfach.
 
Ich kann z.B. sagen:


Code:
If position = 1
{
((TextView)view).setBackgroundColor(Color.rgb(202,255,112));

[COLOR=DeepSkyBlue]***[/COLOR]
}

*** Jetzt müsste ich an dieser Stelle die Farbe an Stelle 11, 21 und 31 auf weiß setzen... nur finde ich keine passende Methode dafür.

Es hört sich eigentlich wirklich einfach an, aber ich bekomms einfach nicht hin... :confused2:
 
wie wärs mit
setBackgroundColor(Color.rgb(255,255,255)?

Und nein du musst nicht die stellen 11 21 und 31 auf weiß setzen.
Du musst alle bis auf die gemerkte position auf weiß setzen. (bzw auf die original Hintergrundfarbe)

Am besten wäre also
if (position == 1)
setBackgroundColor(202,255,112)
else
setBackgroundColor(weiß)

Ich glaube das Problem ist du hast immer noch nicht genau verstanden wie da ganze funktioniert.
Es gibt Views und es gibt Listeneinträge beides ist voneinander vollkommen unabhängig.


Hier mal ein Beispielcode:
Anmekrung der merkt sich nur das zuletzt angeklickte Item, wenn ich z.B. 3 verschiedene anklicke werden alle 3 rot
wenn ich runterscrolle und dann wieder hoch wird nur das dritte wieder eingefärbt.
Code:
package de.amfa.listview;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnItemClickListener {

	List<String> stringList = new ArrayList<String>();
	int clickedItem = -1;
	int clickedColor = Color.rgb(255, 0, 0);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListView lv = (ListView) findViewById(R.id.listView1);
		fillList();
		lv.setOnItemClickListener(this);
		lv.setAdapter(new BaseAdapter() {

			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				if (convertView != null) {
					((TextView) convertView).setText(stringList.get(position));
					if (position != clickedItem) {
						convertView.setBackground(null);
					} else {
						convertView.setBackgroundColor(clickedColor);
					}
					return convertView;
				}
				TextView tv = new TextView(getApplicationContext());
				tv.setText(stringList.get(position));
				return tv;
			}

			@Override
			public long getItemId(int position) {
				return stringList.get(position).hashCode();
			}

			@Override
			public Object getItem(int position) {
				return stringList.get(position);
			}

			@Override
			public int getCount() {
				return stringList.size();
			}
		});
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		view.setBackgroundColor(clickedColor);
		clickedItem = position;

	}

	private void fillList() {
		for (int i = 0; i < 100; i++) {
			stringList.add("List item " + i);
		}
	}

}
 
Zuletzt bearbeitet:
Wenn der String des Items == Der String des geklickten Items
grün
sonst
weiß


genau die Version hatte ich schon ausprobiert und hatte den gleichen Effekt...
 
Ich würde die Position nehmen.
Theoretisch wäre es möglich, dass sich der Text ja ändert.

Je nachdem wie du das speicherst funktioniert es dann nicht mehr.
Aber sie dir mal mein Edit an ich hab da ein wenig Code hinzugefügt.
 
Zurück
Oben Unten