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.

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: el evento onItemClick () de ListView no se llama
  • Android ListView cuando los elementos se pueden enfocar, deshabilita los clics
  • Función de desplazamiento de listview dentro de la vista de desplazamiento
  • Problema de menú emergente en Android ListView
  • Buscador de Android
  • GridView con colSpan y rowSpan
  • Nesting Android ViewPager, Swiping ListItems dentro de un ListView horizontalmente
  • La posición de desplazamiento salta a los elementos de la lista anterior mientras se desplaza hacia arriba en la vista de lista personalizada
  • ArrayAdapter: debe proporcionar un id de recurso para una vista de texto
  • ListView dentro de un ScrollView
  • ListView OnItemClick listner no funciona en fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.