Resalte el efecto mientras presiona el elemento en el adaptador ListView personalizado

Hay un efecto visual del sistema cada vez que se hace clic en una vista en Android. En Lollipop es el efecto ripple. Cuando creé un ListView y lo asocié a un ArrayAdapter ordinario, este efecto estaba presente. Ahora que he agregado un ListView personalizado, este efecto se pierde.

Ahora, he intentado aislar cuál es el problema, y ​​puesto que usar la misma disposición del artículo de la lista con un adaptador del defecto trabajado agradable, diría que el problema está en mi adaptador de encargo.

He visto muchas soluciones relacionadas con este caso que acaba de implementar el efecto de rizo que llama algunos drawables; esto no es lo que estoy tratando de hacer. El efecto de rizo sólo se muestra porque estoy ejecutando la aplicación en Android 5, ahora lo que quiero hacer es tener el efecto de resaltado del sistema por defecto para mis artículos cuando se hace clic.

Aquí están los (esperanzadamente) piezas relacionadas de mi adaptador personalizado:

public class CustomCardSetsAdapter extends BaseAdapter { List<Card> totalList; ArrayList<Boolean> hiddenItems; ListView parentLV; Integer curPosition = -1; public static int selectedRowIndex; public CustomCardSetsAdapter(CardSets cardList, ListView parentListView) { this.parentLV = parentListView; assignSetValues(cardList); totalList = cardList.getBlackrockMountain(); totalList.addAll(cardList.getClassic()); totalList.addAll(cardList.getCurseofNaxxramas()); totalList.addAll(cardList.getGoblinsvsGnomes()); Collections.sort(totalList, new Comparator<Card>() { public int compare(Card f1, Card f2) { return f1.toString().compareTo(f2.toString()); } }); hiddenItems = new ArrayList<>(); for (int i = 0; i < totalList.size(); i++) { if(!totalList.get(i).getCollectible()) hiddenItems.add(true); else hiddenItems.add(false); } } @Override public int getCount() { return (totalList.size() - getHiddenCount()); } @Override public View getView(final int position, View convertView, final ViewGroup parent) { final int index = getRealPosition(position); if(convertView == null) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); convertView = inflater.inflate(R.layout.card_list_item, parentLV, false); } convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Integer prevPosition = curPosition; curPosition = position; if(prevPosition >= parentLV.getFirstVisiblePosition() && prevPosition <= parentLV.getLastVisiblePosition()) { View view = parentLV.getChildAt(prevPosition- parentLV.getFirstVisiblePosition()); parentLV.getAdapter().getView(prevPosition,view, parentLV); } v.setBackgroundColor(Color.WHITE); } }); Card curCard = totalList.get(index); TextView cardName = (TextView) convertView.findViewById(R.id.cardName); cardName.setText(curCard.getName()); setRarityColor(curCard,cardName); TextView manaCost = (TextView) convertView.findViewById(R.id.manaCost); manaCost.setText((curCard.getCost()).toString()); ImageView setIcon = (ImageView) convertView.findViewById(R.id.setIcon); setSetIcon(curCard,setIcon); if(position == curPosition) convertView.setBackgroundColor(Color.WHITE); else convertView.setBackgroundColor(Color.TRANSPARENT); return convertView; } @Override public int getItemViewType(int position) { return R.layout.card_list_item; } @Override public int getViewTypeCount() { return 1; } @Override public boolean isEmpty() { return false; } private int getHiddenCount() { int count = 0; for(int i = 0;i <totalList.size();i++) if(hiddenItems.get(i)) count++; return count; } private int getRealPosition(int position) { int hElements = getHiddenCountUpTo(position); int diff = 0; for(int i=0;i<hElements;i++) { diff++; if(hiddenItems.get(position+diff)) i--; } return (position + diff); } private int getHiddenCountUpTo(int location) { int count = 0; for(int i=0;i<=location;i++) { if(hiddenItems.get(i)) count++; } return count; } } 

Gracias por adelantado.

One Solution collect form web for “Resalte el efecto mientras presiona el elemento en el adaptador ListView personalizado”

en su XML ListView, agregue:

  android:drawSelectorOnTop="true" 

También creo que está utilizando su adaptador incorrecto …

Utilice el patrón de ViewHolder en su adaptador:

 public class CustomCardSetsAdapter extends BaseAdapter { List<Card> totalList; ArrayList<Boolean> hiddenItems; ListView parentLV; Integer curPosition = -1; public static int selectedRowIndex; private class ViewHolderRow{ TextView cardName; TextView manaCost; ImageView setIcon; } public CustomCardSetsAdapter(CardSets cardList, ListView parentListView) { this.parentLV = parentListView; assignSetValues(cardList); totalList = cardList.getBlackrockMountain(); totalList.addAll(cardList.getClassic()); totalList.addAll(cardList.getCurseofNaxxramas()); totalList.addAll(cardList.getGoblinsvsGnomes()); Collections.sort(totalList, new Comparator<Card>() { public int compare(Card f1, Card f2) { return f1.toString().compareTo(f2.toString()); } }); hiddenItems = new ArrayList<>(); for (int i = 0; i < totalList.size(); i++) { if(!totalList.get(i).getCollectible()) hiddenItems.add(true); else hiddenItems.add(false); } } @Override public int getCount() { return (totalList.size() - getHiddenCount()); } @Override public View getView(final int position, View convertView, final ViewGroup parent) { final int index = getRealPosition(position); ViewHolderRow theRow; if(convertView == null) { theRow = new ViewHolderRow(); LayoutInflater inflater = LayoutInflater.from(parent.getContext()); convertView = inflater.inflate(R.layout.card_list_item, parentLV, false); // Cache your views theRow.cardName = (TextView) convertView.findViewById(R.id.cardName); theRow.manaCost = (TextView) convertView.findViewById(R.id.manaCost); theRow.setIcon = (ImageView) convertView.findViewById(R.id.setIcon); // Set the Tag to the ViewHolderRow convertView.setTag(theRow); }else{ // get the Row to re-use theRow = (ViewHolderRow) convertView.getTag(); } //... Removed convertView.setOnClickListener Card curCard = totalList.get(index); // Set Items theRow.cardName.setText(curCard.getName()); setRarityColor(curCard,theRow.cardName); theRow.manaCost.setText((curCard.getCost()).toString()); setSetIcon(curCard,theRow.setIcon); if(position == curPosition){ convertView.setBackgroundColor(Color.WHITE); }else{ convertView.setBackgroundColor(Color.TRANSPARENT); } return convertView; } @Override public int getItemViewType(int position) { return R.layout.card_list_item; } @Override public int getViewTypeCount() { return 1; } @Override public boolean isEmpty() { return false; } private int getHiddenCount() { int count = 0; for(int i = 0;i <totalList.size();i++) if(hiddenItems.get(i)) count++; return count; } private int getRealPosition(int position) { int hElements = getHiddenCountUpTo(position); int diff = 0; for(int i=0;i<hElements;i++) { diff++; if(hiddenItems.get(position+diff)) i--; } return (position + diff); } private int getHiddenCountUpTo(int location) { int count = 0; for(int i=0;i<=location;i++) { if(hiddenItems.get(i)) count++; } return count; } } 

Establecer un onListItemClickListener en lugar de utilizar esto en todo el …

 yourListView.setOnItemClickListener(ListListener); private final OnItemClickListener ListListener = new OnItemClickListener{ @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { // ... Do something on click } } 
  • Android ListView con múltiples selecciones y adaptadores personalizados
  • Listview addFooterView problemas
  • Elementos de lista personalizada que no responden a state_checked en el selector
  • Listas personalizadas de Android
  • Adaptador con hasStableIds utilizando GUID o Strings como Ids
  • (Android) listview con varios botones, no se puede hacer clic en el elemento de lista
  • Android: pasar el evento de gestos a otra vista
  • Evento onClick no funciona en el control anidado de elementos de lista en android
  • Ordenar la vista de lista con el adaptador de matriz
  • Cree dinámicamente un listview con filas de encabezado para cada mes
  • La vista de pie de página para ListView no se muestra en 1 dispositivo, pero está en otro?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.