ich habe eine Listenansicht in meiner App (dies ist das XML-Layout):
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/arrayList"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:textFilterEnabled="true"
Android:scrollbars="vertical"
Android:drawSelectorOnTop="true">
</ListView>
Jedes Element meiner Listenansicht besteht aus zwei TextView-Elementen:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout Android:layout_width="fill_parent"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/row_container"
Android:padding="5px" Android:layout_height="wrap_content"
Android:background="@color/white" Android:shrinkColumns="0">
<TableRow>
<TextView Android:layout_height="wrap_content"
Android:layout_width="wrap_content" Android:layout_below="@+id/
description"
Android:id="@+id/description"
Android:textColor="@color/black"
Android:scrollHorizontally="true"
Android:singleLine="true"></TextView>
</TableRow>
<TableRow>
<TextView Android:layout_width="wrap_content"
Android:layout_height="wrap_content" Android:id="@+id/result"
Android:textColor="@color/grey"
Android:maxLines="1"
Android:scrollHorizontally="true"></TextView>
</TableRow>
</TableLayout>
Ich fülle meine listView von einem ArrayAdapter auf folgende Weise aus:
public class Matches extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//set layout
setContentView(R.layout.list_layout);
// obtain reference to listview
ListView listView = (ListView) findViewById(R.id.arrayList);
ArrayAdapter<Match> arrayAdapter = new ArrayAdapter<Match>(
this, R.layout.custom_row, R.id.description, createItems()) {
@Override
public View getView (int position, View convertView, ViewGroup parent){
Match item = getItem (position);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.custom_row, null);
TextView description = (TextView)rowView.findViewById(R.id.description);
TextView result = (TextView)rowView.findViewById(R.id.result);
description.setText(item.description + " Risultato: " + item.result );
result.setText(item.date + " " + item.hour);
return rowView;
}
};
listView.setAdapter(arrayAdapter);
Mein Ziel ist es, die Textfarbe und den Hintergrund dieser untergeordneten Ansichten ändern zu können, wenn das übergeordnete Element ausgewählt oder gedrückt wird.
Wie kann ich es tun?
Die untergeordneten Ansichten in Ihrer Listenzeile sollten immer als ausgewählt betrachtet werden, wenn die übergeordnete Zeile ausgewählt wird. Sie sollten also in der Lage sein, in den Ansichten, die Sie ändern möchten, einen normalen Zeichnungs-/Farblistenstatus festzulegen. Es ist kein chaotischer Java-Code erforderlich. Siehe this SO post .
Insbesondere würden Sie die textColor
Ihrer TextViews auf eine XML-Ressource wie die folgende setzen:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="true" Android:drawable="@color/black" /> <!-- focused -->
<item Android:state_focused="true" Android:state_pressed="true" Android:drawable="@color/black" /> <!-- focused and pressed-->
<item Android:state_pressed="true" Android:drawable="@color/green" /> <!-- pressed -->
<item Android:drawable="@color/black" /> <!-- default -->
</selector>
Fügen Sie in Ihremain.xmlFolgendes in Ihre ListView ein:
Android:drawSelectorOnTop="false"
Android:listSelector="@Android:color/darker_gray"
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:state_pressed="true" Android:drawable="@drawable/YOUR DRAWABLE XML" />
<item Android:drawable="@drawable/YOUR DRAWABLE XML" />
</selector>
Hier ist ein guter Artikel wie Selektoren mit Listen verwendet werden.
Anstatt es als Android: Hintergrund der ListView festzulegen, möchten Sie Android: ListSelector wie folgt einstellen:
<ListView Android:id="@+id/list"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:divider="@null"
Android:dividerHeight="0dip"
Android:listSelector="@drawable/list_selector" />
listview.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(final AdapterView<?> parent, View view,
final int position, long id) {
// TODO Auto-generated method stub
parent.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.listlongclick_selection));
return false;
}
});
Deklarieren Sie Listenelementkomponenten als final außerhalb Ihres setOnClickListener-Objekts oder was auch immer Sie auf Ihr Listenelement anwenden möchten, wie folgt:
final View yourView;
final TextView yourTextView;
Wenn Sie onClick oder die von Ihnen verwendete Methode überschreiben, legen Sie einfach die Farben wie folgt fest:
yourView.setBackgroundColor(Color.WHITE/*or whatever RGB suites good contrast*/);
yourTextView.setTextColor(Color.BLACK/*or whatever RGB suites good contrast*/);
Oder ohne die Abschlussdeklaration: Wenn Sie beispielsweise ein onClick () für einen benutzerdefinierten Adapter zum Auffüllen einer Liste implementieren, habe ich dies in getView () für meinen setOnClickListener/onClick () verwendet:
//reset color for all list items in case any item was previously selected
for(int i = 0; i < parent.getChildCount(); i++)
{
parent.getChildAt(i).setBackgroundColor(Color.BLACK);
TextView text=(TextView) parent.getChildAt(i).findViewById(R.id.item);
text.setTextColor(Color.rgb(0,178,178));
}
//highlight currently selected item
parent.getChildAt(position).setBackgroundColor(Color.rgb(0,178,178));
TextView text=(TextView) parent.getChildAt(position).findViewById(R.id.item);
text.setTextColor(Color.rgb(0,178,178));
Sehr alt, aber ich habe gerade damit zu kämpfen gehabt, so habe ich es in reinem XML gelöst. In res/values / colors.xml habe ich drei Farben hinzugefügt (die color _... );
<resources>
<color name="black_overlay">#66000000</color>
<color name="colour_highlight_grey">#ff666666</color>
<color name="colour_dark_blue">#ff000066</color>
<color name="colour_dark_green">#ff006600</color>
</resources>
Im Ordner " res/drawable " habe ich listview_colours.xml erstellt, das Folgendes enthielt.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/colour_highlight_grey" Android:state_pressed="true"/>
<item Android:drawable="@color/colour_dark_blue" Android:state_selected="true"/>
<item Android:drawable="@color/colour_dark_green" Android:state_activated="true"/>
<item Android:drawable="@color/colour_dark_blue" Android:state_focused="true"/>
</selector>
In der main_activity.xml finden Sie die Listenansicht und fügen Sie das Zeichen zu listSelector hinzu.
<ListView
Android:id="@+id/menuList"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:listSelector="@drawable/listview_colours"
Android:background="#ff222222"/>
</LinearLayout>
Spielen Sie mit den state _... items in der listview_colours.xml , um den gewünschten Effekt zu erzielen.
Es gibt auch eine Methode, mit der Sie den Stil der Listenansicht festlegen können, aber ich habe es nie geschafft, sie zum Laufen zu bringen