i have a list View in my app (this is the 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>
Each item of my list View is composed of two TextView:
<?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>
I'm populating my listView from an ArrayAdapter, in this way:
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);
My goal is to be able to change the text color and the backgorund of these child views whenever the parent is selected or pressed.
How can i do it?
The child views in your list row should be considered selected whenever the parent row is selected, so you should be able to just set a normal state drawable/color-list on the views you want to change, no messy Java code necessary. See this SO post.
Specifically, you'd set the textColor
of your textViews to an XML resource like this one:
<?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>