wake-up-neo.com

So ändern Sie die Farbe der ListView-Elemente im Fokus und beim Klicken

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?

27
nolanofra

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> 
37
Yoni Samlan

Fügen Sie in Ihremain.xmlFolgendes in Ihre ListView ein:

Android:drawSelectorOnTop="false"

Android:listSelector="@Android:color/darker_gray"
31
Anil Arigela
<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>
5
Dhiral Pandya

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" />
4
fuliozor
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;
        }
    });
1
Vinay

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));
0
Callin'

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

0
Recycled Steel