Sí, Desde la perspectiva de un desarrollador de iOS, me parece que es muy difícil de aplicar características como "selección por defecto al iniciar conjunto" y "recordar el estado de selección después de usuario ha hecho clic fila" a ListView.
Así que vamos a empezar con "recordar la selección" problema first.The es que incluso si usted sabe que puede utilizar XML de selección para definir más destacado/presionado/enfoque style.but que el estilo no se mantuvo después de usuario hizo clic en esa fila.Por ejemplo, tengo un selector de XML resaltado (list_selector.xml según Resol carpeta/estirable) así (pero puede tener otros campos tienen que poner de relieve como el color de texto de Vista de Texto en fila):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_selector_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/list_selector_pressed" android:state_selected="true" />
</selector>
y list_selector_pressed. XML, que define el estilo de resaltado - establecer el color de fondo a un color gris:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/dark_gray" />
</shape>
</item>
</layer-list>
Así como @ David Hedlund sugirió:
Más bien, asignar una OnItem ClickListener, y haz que guarde la identificación del ítem seleccionado en alguna variable.
es necesario crear una variable de instancia en la parte superior de su clase:
private View currentSelectedView;
luego ir a
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
Muy simple: comprobamos si currentSelectedView es null o corriente clic o no. primero debemos descolgar cualquier estilo llamando al método unhighlightCurrentRow (currentSelectedView) --- usted puede preguntarse por qué pasamos la variable instantánea currentSelectedView como parámetro, lo explicaré más adelante. Luego asignamos view a currentSelectedView y resaltamos la fila actual; para que el estilo persista después de que el usuario hace clic.
private void unhighlightCurrentRow(View rowView) {
rowView.setBackgroundColor(Color.TRANSPARENT);
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.white));
}
private void highlightCurrentRow(View rowView) {
rowView.setBackgroundColor(getResources().getColor(
R.color.dark_gray));
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.yellow));
}
Aja, eso es todo. Así es como implementamos "recordar selección" para la vista de lista. Como se ve, tenemos que duplicar los códigos para peinar, tanto en XML y el código de Java - bastante estúpido :(
siguiente acerca de "selección por defecto ajuste" Usted puede pensar que usted puede hacer esto
.
listView.setAdapter(adatper)
listView.setSelection(0);
currentSelectedView = listView.getChildAt(0);
highlightCurrentRow(currentSelectedView);
en onCreate() en la actividad o onActivityCreated() en el fragmento.
Pero si lo ejecuta, obtendrá una excepción NullPointer y por qué? porque en este momento, la vista de lista no se representa sin embargo no lo hace y Android como iOS, que tiene viewWillAppear. Así que tienes que crear una variable instantánea para recordar si es primera vez para rendir celular vista de lista y en onListItemClick ha decidido eliminar esa variable:
Así que bajo la declaración currentSelectedView:
private Boolean firstTimeStartup = true;
a continuación, añadir métodos: supongamos que queremos resaltar la primera fila en la vista de lista:
public class HomeAdapter extends ArrayAdapter<String> {
int layoutResourceId;
public HomeAdapter(Context context, int textViewResourceId,
ArrayList<String> objects) {
super(context, textViewResourceId, objects);
layoutResourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
layoutResourceId, null);
}
if (firstTimeStartup && postion == 0) {
highlightCurrentRow(convertView);
} else {
unhighlightCurrentRow(convertView);
}
TextView title = (TextView) convertView
.findViewById(R.id.menuTitle);
title.setText(getItem(position));
return convertView;
}
}
Bastante simple. Pero hay que hacer algunos cambios en el método de onListItemClick:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (firstTimeStartup) {// first time highlight first row
currentSelectedView = l.getChildAt(0);
}
firstTimeStartup = false;
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
hay que ir! Disfruta de Android :)
Ya intenté usar setSelection() cuando volví, pero no sirve-ante todo, la fila no está resaltada en absoluto (sin color de fondo), y la segunda fila se encuentra en la parte superior de la pantalla, aunque estaba ubicado en algún lugar en el medio cuando me fui. Gracias. – WhiteTigerK
Otra cosa: en la lista de contactos del dispositivo al usar la bola de seguimiento para seleccionar un contacto y luego presionar la bola de seguimiento para ver sus detalles, se guarda el estado de la lista de contactos, por lo que al volver a la lista de contactos el contacto sigue seleccionado y su la ubicación en la pantalla es la misma. Por lo tanto, supongo que este comportamiento es posible de lograr. Gracias. – WhiteTigerK
sí, se guardará el estado de selección, pero si en algún momento toca la pantalla, se activa * modo táctil * y cuando está en modo táctil, como ya ha notado, no hay comentarios visuales para un elemento seleccionado (solo breves comentarios cuando se toca el elemento, lo que no ocurre cuando regresa a la vista de lista). Este es el comportamiento predeterminado. no lo cambies –