Cómo establecer el color de fila alternativo de Listview y el color de fondo del elemento seleccionado
Tengo una vista de lista. He asignado colores de fila alternativos como el siguiente en el método getView () del adaptador:
if(position % 2 ==1) { convertView.setBackgroundColor(Color.rgb(231, 249, 255)); } else { convertView.setBackgroundColor(Color.rgb(195, 240, 255)); }
Por encima del código está funcionando bien. Ahora quiero cambiar el color del elemento de lista seleccionado. Para eso he seguido el siguiente procedimiento:
- Archivo XML válido da un error "no se pudo analizar" en Android ADT
- Android Selector Drawable no funciona con atributos
- Android: Cómo hacer un selector desplegable
- Pulgar personalizado para un buscador en Android
- ¿Cómo cambiar el color presionado a otro color del selector dinámicamente?
He creado en listSelector xml como a continuación:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Selected --> <item android:state_focused="true" android:state_selected="false" android:drawable="@drawable/focused"/> <!-- Pressed --> <item android:state_selected="true" android:state_focused="false" android:drawable="@drawable/selected" /> </selector>
Y he asignado el selector anterior a mi lista como a continuación:
myList.setSelector(R.drawable.list_selector);
Pero no estoy recibiendo el color del elemento de lista seleccionado.
¿Puede cualquier persona por favor decirme cómo fijar el color alterno de la fila y el color seleccionado del artículo de la lista a una lista del androide.
- Android drawable invalid start tag
- Selector de botones de Android
- Android linearlayout selector de fondo
- Cambio de relleno en el selector
- Marcar al usuario seleccionado como se ha activado en FriendPicker (Facebook SDK para Android)
- Cómo cambiar el color del texto en la prensa de un textview particular en un linearlayout
- Selector hereda
- NullPointerException en el método de mutación de Drawable Android 1.6
Intente esto
Artists_list_backgroundcolor.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="false" android:state_pressed="false" android:drawable="@color/normal" /> <item android:state_pressed="true" android:drawable="@color/itemselected" /> <item android:state_selected="true" android:state_pressed="false" android:drawable="@color/itemselected" /> </selector>
Colors.xml
<resources> <color name="normal">#ffffff</color> <color name="itemselected">#EDEDED</color> </resources>
Y utilizarlo en getView ()
if (position % 2 == 0) { view.setBackgroundResource(R.drawable.artists_list_backgroundcolor); } else { view.setBackgroundResource(R.drawable.HERE_FOR_ALTERNATE); }
Para referencia Link
Espero que esto te ayudará.
Si desea saltar adelante, puede descargar el proyecto IntelliJ desde mi sitio: developersfound.com/AlternatingColoursListView.zip
Hay un pequeño fallo con el desplazamiento en esta demo que sólo he resuelto parcialmente. Sin embargo, sigue siendo útil para listas pequeñas. Si logras arreglar esto, vuelve a publicarlo para apilar el desbordamiento.
Lo que he hecho es; He puesto dos elementos de TextView en el diseño ListItem y los ha alternado mediante programación en el CustomAdapter.
Aquí está el diseño XML para el elemento ListView.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/test_container" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/img_dev4u_list_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight=".1" android:layout_gravity="left|top" android:src="@drawable/exaple_icon"/> <TextView android:id="@+id/lbl_black_on_gold" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="@color/gold_color" android:textColor="@color/black_color" android:text="Black on Gold" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_weight=".6" android:gravity="center_vertical|center_horizontal" android:layout_gravity="center_vertical"/> <TextView android:id="@+id/lbl_gold_on_black" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="@color/black_color" android:textColor="@color/gold_color" android:text="Gold on Black" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_weight=".6" android:gravity="center_vertical|center_horizontal" android:layout_gravity="center_vertical"/> <Button android:id="@+id/cmd_click_me_i_am_lonely" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:layout_weight="0.3" android:paddingLeft="0dp" android:paddingRight="0dp" android:paddingTop="0dp" android:paddingBottom="0dp" android:layout_gravity="right|top"/> </LinearLayout>
Y aquí está el CustomAdapter
package com.WarwickWestonWright.alternatingcolourslistview.app; import android.app.Activity; import android.content.res.Resources; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.*; import com.WarwickWestonWright.alternatingcolourslistview.app.ListItems; import com.WarwickWestonWright.alternatingcolourslistview.app.R; import java.util.ArrayList; public class AlternatingColoursAdapter extends ArrayAdapter { private final ArrayList<ListItems> list; private static Activity context; private Resources resources; private boolean alternateGoldBlack = false; private static LinearLayout.LayoutParams layoutParams = null; public AlternatingColoursAdapter(Activity context, ArrayList<ListItems> list, Resources resources) { super(context, R.layout.list_item_alternating_colours, list); this.context = context; this.resources = resources; this.list = list; } static class ViewHolder { protected ImageView img_dev4u_list_image; protected TextView lbl_black_on_gold; protected TextView lbl_gold_on_black; protected Button cmd_click_me_i_am_lonely; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; ViewHolder viewHolder = new ViewHolder(); if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.list_item_alternating_colours, null); viewHolder.img_dev4u_list_image = (ImageView) view.findViewById(R.id.img_dev4u_list_image); viewHolder.lbl_black_on_gold = (TextView) view.findViewById(R.id.lbl_black_on_gold); viewHolder.lbl_gold_on_black = (TextView) view.findViewById(R.id.lbl_gold_on_black); viewHolder.cmd_click_me_i_am_lonely = (Button) view.findViewById(R.id.cmd_click_me_i_am_lonely); viewHolder.cmd_click_me_i_am_lonely.setTag(viewHolder); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } ViewHolder holder = (ViewHolder) view.getTag(); if(alternateGoldBlack == false) { alternateGoldBlack = true; layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.MATCH_PARENT, 99); holder.lbl_black_on_gold.setLayoutParams(layoutParams); holder.lbl_black_on_gold.setText(list.get(position).getMessage()); layoutParams = new LinearLayout.LayoutParams(0, 0, 0); holder.lbl_gold_on_black.setText(""); holder.lbl_gold_on_black.setLayoutParams(layoutParams); } else {//if(alternateGoldBlack = true) alternateGoldBlack = false; layoutParams = new LinearLayout.LayoutParams(0, 0, 0); holder.lbl_black_on_gold.setText(""); holder.lbl_black_on_gold.setLayoutParams(layoutParams); layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.MATCH_PARENT, 99); holder.lbl_gold_on_black.setLayoutParams(layoutParams); holder.lbl_gold_on_black.setText(list.get(position).getMessage()); }//End if(alternateGoldBlack == true) holder.cmd_click_me_i_am_lonely.setText(list.get(position).getButtonText()); return view; }//public View getView(int position, View convertView, ViewGroup parent) public int getCount() { if(list.size() <= 0) { return 1; } return list.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } }
Cuando / si descarga y abre el proyecto notará que en la clase ListItemsFragment he intentado resolver el problema de desplazamiento con un onTouchListener. Si eliminas este oyente, verás lo que intenté arreglar. Estaré explorando esta solución mediante el uso de Fragmentos sin cabeza (fragmentos que se escriben directamente en un diseño sin la palabra clave 'Fragmento' en el diseño XML)
Como se prometió, he trabajado en la fijación del programa anterior con Fragmentos sin cabeza. Estoy dejando el puesto anterior, porque todavía tiene sus 'usos. He preparado una descarga para usted en la forma de un proyecto Gradle IntelliJ aquí: http://developersfound.com/AlternatingListViewColors.zip
Esta solución utiliza diseños dinámicos en lugar de fragmentos. La sobrecarga del desarrollador o esto es mayor porque no puedes usar infladores.
Desafortunadamente, no pude resolver este problema con fragmentos estándar y adaptadores personalizados, pero me mantendré atento a cualquier código útil. Aunque la sobrecarga de programación para esto es alta, es completamente estable y libre de fallos.
Aquí está el Layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.WarwickWestonWright.alternatinglistviewcolors.app.MainActivity$PlaceholderFragment"> <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/scrollView"> <LinearLayout android:id="@+id/LLayoutDynamicContainer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="5dp" android:paddingBottom="15dp" android:layout_below="@+id/LblMainTitle"> </LinearLayout> </ScrollView> </RelativeLayout>
Y aquí está la actividad principal:
import android.app.AlertDialog; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import java.util.ArrayList; public class MainActivity extends ActionBarActivity implements MainFragment.OnFragmentInteractionListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction().add(R.id.container, new MainFragment()).commit(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } //This popup message comes from the DynamicLayout and through the MainFragment. though the popup could have just as easily come from the MainFragment. //This code is here as it is sometimes necessary to deal with dynamic data in a different process from the process that renders the data. @Override public void onFragmentInteraction(Bundle bundle, int itemSelected) { ArrayList<MyListItem> myListItems = bundle.getParcelableArrayList("Values"); new AlertDialog.Builder(this).setTitle("Contents").setMessage("You selected: " + Integer.toString(itemSelected)).setNeutralButton("OK", null).show(); } }
Aquí está el Fragmento Principal:
import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; public class MainFragment extends Fragment implements DynamicLayout.IDynamicLayout { public interface OnFragmentInteractionListener { public void onFragmentInteraction(Bundle bundle, int itemSelected); } private DynamicLayout.IDynamicLayout iDynamicLayout = this; private DynamicLayout dynamicLayout; private ArrayList<MyListItem> myListItems; private OnFragmentInteractionListener mListener; public MainFragment() {} /* @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.main_fragment, container, false); myListItems = new ArrayList<MyListItem>(); myListItems.add(new MyListItem("1", "MyValueOne")); myListItems.add(new MyListItem("2", "MyValueTwo")); myListItems.add(new MyListItem("3", "MyValueThree")); myListItems.add(new MyListItem("4", "MyValueFour")); myListItems.add(new MyListItem("5", "MyValueFive")); myListItems.add(new MyListItem("6", "MyValueSix")); myListItems.add(new MyListItem("7", "MyValueSeven")); myListItems.add(new MyListItem("8", "MyValueEight")); myListItems.add(new MyListItem("9", "MyValueNine")); myListItems.add(new MyListItem("10", "MyValueTen")); myListItems.add(new MyListItem("11", "MyValueEleven")); myListItems.add(new MyListItem("12", "MyValueTwelve")); myListItems.add(new MyListItem("13", "MyValueThirteen")); myListItems.add(new MyListItem("14", "MyValueFourteen")); myListItems.add(new MyListItem("15", "MyValueFifteen")); myListItems.add(new MyListItem("16", "MyValueSixteen")); myListItems.add(new MyListItem("17", "MyValueSeventeen")); myListItems.add(new MyListItem("18", "MyValueEighteen")); myListItems.add(new MyListItem("19", "MyValueNineteen")); myListItems.add(new MyListItem("20", "MyValueTwenty")); myListItems.add(new MyListItem("21", "MyValueTwentyOne")); dynamicLayout = new DynamicLayout(iDynamicLayout, getActivity(), rootView, myListItems, R.id.LLayoutDynamicContainer); return rootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnFragmentInteractionListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } //This code passes from the DynamicLayout to the Underlying main activity though this is not necessarily necessary @Override public void sentBundleFromDynamicLayout(Bundle bundle, int itemSelected) { mListener.onFragmentInteraction(bundle, itemSelected); } }
Y finalmente aquí está el diseño dinámico principal:
import android.app.Activity; import android.graphics.Typeface; import android.os.Bundle; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.LinearLayout; import java.util.ArrayList; public class DynamicLayout implements View.OnClickListener { interface IDynamicLayout { public void sentBundleFromDynamicLayout(Bundle bundle, int itemSelected); } private IDynamicLayout caller; private Activity context; private ArrayList<MyListItem> myListItems; private MyListItem myListItem; private LinearLayout linearLayoutTarget; private int linearLayoutTargetID; private LinearLayout.LayoutParams layoutParams; private int dpDensity; public DynamicLayout(IDynamicLayout caller, Activity context, View rootView, ArrayList<MyListItem> myListItems, int linearLayoutContainerID) { this.caller = caller; this.context = context; this.myListItems = myListItems; int categoriesCount = myListItems.size(); this.linearLayoutTargetID = linearLayoutContainerID; this.dpDensity = DPDensity.getPxFromDP(1, context.getResources()); linearLayoutTarget = (LinearLayout) rootView.findViewById(linearLayoutTargetID); int colourSwitch = 0; for (int i = 0; i < categoriesCount; i++) { CheckBox dynaCheckBox = new CheckBox(context); dynaCheckBox.setCompoundDrawablePadding(dpDensity * 35); dynaCheckBox.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); //dynaCheckBox.setButtonDrawable(R.drawable.developers4utheme_btn_check_holo_dark); dynaCheckBox.setTypeface(Typeface.DEFAULT_BOLD); dynaCheckBox.setBackgroundResource(R.drawable.colored_bg); if(colourSwitch == 0) { dynaCheckBox.setTextColor(context.getResources().getColor(R.color.my_red_red)); } else if(colourSwitch == 1) { dynaCheckBox.setTextColor(context.getResources().getColor(R.color.my_gold_color)); } else if(colourSwitch == 2) { dynaCheckBox.setTextColor(context.getResources().getColor(R.color.my_exit_green)); } colourSwitch++; if(colourSwitch == 3) {colourSwitch = 0;} dynaCheckBox.setEnabled(true); dynaCheckBox.setClickable(true); dynaCheckBox.setGravity(Gravity.LEFT); dynaCheckBox.setGravity(Gravity.CENTER_VERTICAL); dynaCheckBox.setOnClickListener(this); dynaCheckBox.setTag(myListItems.get(i).getMyKey()); dynaCheckBox.setText(myListItems.get(i).getMyValue()); layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); dynaCheckBox.findViewWithTag(myListItems.get(i).getMyKey()).setLayoutParams(layoutParams); linearLayoutTarget.addView(dynaCheckBox); } }//End public DynamicLayout(IDynamicLayout caller, Activity context, View rootView, ArrayList<MyListItem> myListItems, int linearLayoutContainerID) @Override public void onClick(View v) { int itemSelected = Integer.parseInt(v.getTag().toString()); Bundle bundle = new Bundle(); bundle.putParcelableArrayList("Values", myListItems); caller.sentBundleFromDynamicLayout(bundle, itemSelected); } }
- Phonegap android registro para gcm
- Elementos en niveles múltiples ExpandableListView no siempre se puede hacer clic