para - manual de programacion android pdf
Seleccionar programáticamente el elemento ListView en Android (9)
Esto es lo que funcionó para mí:
1) Establezca el comportamiento de elección para la Lista.
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
2) Establece el estado verificado de la posición especificada.
mListView.setItemChecked(1,true); //Don''t make the same mistake I did by calling this function before setting the listview adapter.
3) Agregue un nuevo estilo dentro del recurso de estilo (res / values) como este:
<style name="activated" parent="android:Theme.Holo">
<item name="android:background">@android:color/holo_green_light</item>
</style>
Siéntase libre de usar los colores que desee.
4) Use el estilo previamente definido en su ListView:
<ListView
android:id="@+id/listview"
style="@style/activated"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"/>
O en el diseño que usa como fila.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/activated"
>
<!--widgets for your row here-->
</LinearLayout>
Espero que ayude a cualquiera!
Tengo dos fragmentos. El primero con botones dentro, el otro con un ListView
dentro (ListFragment).
Me gustaría el primer fragmento (gracias a sus botones) para permitir al usuario navegar por el ListView que está en el segundo fragmento.
Así que quiero que ListView sea controlado por el primer fragmento con botones.
No tengo problemas para comunicarme entre fragmentos (enviando pedidos del primer fragmento al segundo), pero no sé cómo decirle a mi ListView que seleccione (programáticamente) un elemento de lista en particular.
¿Qué tipo de ListView debería usar y cómo puedo decirle a ListView que seleccione / resalte / enfoque uno de sus elementos?
Estoy en modo táctil mientras el usuario presiona los botones del primer fragmento.
¿Debería usar setFocusableInTouchMode(true)
o setChoiceMode(ListView.CHOICE_MODE_SINGLE)
o algo más?
Esto es para todos los que intentan:
- Seleccione programáticamente un elemento en un ListView
- Hacer que este elemento se mantenga resaltado
Estoy trabajando en Android ICS, no sé si funciona para todos los niveles Api.
Primero crea una vista de lista (o obténgala si ya estás en una listaActivity / listFragment)
A continuación, configure el modo de elección de su vista de lista para que sea único con: Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Luego seleccione programáticamente su artículo con: Mylistview.setItemChecked(position, true);
(posición que es un número entero que indica el rango del elemento a seleccionar)
Ahora su artículo está realmente seleccionado, pero es posible que no vea absolutamente nada porque no hay comentarios visuales de la selección. Ahora tiene dos opciones: puede usar una vista de lista preconstruida o su vista de lista personalizada.
1) Si quieres una simple_list_item_activated_1
de lista simple_list_item_activated_1
, prueba con simple_list_item_activated_1
, simple_list_item_checked
, simple_list_item_single_choice
, etc ...
Puede configurar su vista de lista como esta para, por ejemplo: setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))
Después de la vista de lista predefinida que seleccionó, verá ahora que, cuando se selecciona, tiene marcada una casilla de verificación o el color de fondo cambió, etc.
2) Si usa una vista de lista personalizada, definirá un diseño personalizado que se usará en cada elemento. En este diseño XML, atribuirá un selector para cada vista de pieza en su fila que debe cambiarse cuando se seleccione.
Digamos que cuando se selecciona, quiere que su fila cambie el color del texto y el color del fondo. Su diseño XML se puede escribir como:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/menu_item_background_selector"
android:orientation="horizontal" >
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textColor="@drawable/menu_item_text_selector" />
Ahora, en la carpeta dibujable, crea menu_item_background_selector.xml y menu_item_text_selector.xml.
menu_item_text_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"
android:color="#FFF">
</item>
<item android:state_pressed="true"
android:color="#FFF">
</item>
<item android:state_pressed="false"
android:color="#000">
</item>
</selector>
El texto será blanco cuando se seleccione.
Luego, haga algo similar para su fondo: (recuerde que no está obligado a usar color, pero también puede usar elementos deslizables)
menu_item_background_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"
android:color="#0094CE">
</item>
<item android:state_pressed="true"
android:color="#0094CE">
</item>
<item android:state_pressed="false"
android:color="#ACD52B">
</item>
</selector>
Aquí el fondo es azul cuando se selecciona y verde cuando no está seleccionado.
El elemento principal que me faltaba era android:state_activated
. De hecho, hay (también) muchos estados: activado, presionado, centrado, verificado, seleccionado ...
No estoy seguro si el ejemplo que di con android:state_activated
y android:state_pressed
es el mejor y más limpio, pero parece funcionar para mí.
Pero no tuve que hacer mi propia clase para obtener un Customable Relative Layout (que era sucio y aterrador) ni usé CheckableTextViews. No sé por qué otros usaron esos métodos, tal vez depende del nivel de Api.
La respuesta de Jecimi funcionó para mí, excepto por una pequeña parte. Me gustaría compartirlo para otros. Llamando a list.setItemChecked( 0, true );
en onCreate () de FragmentActivity no funcionó. En getView()
del adaptador list.getCheckedItemPosition( )
devolvió -1.
Tengo que llamar a este método desde el protected void onPostCreate( Bundle savedInstanceState )
.
Me gusta esto
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
try {
int pos = 0;
listview.performItemClick(null, pos, listview.getItemIdAtPosition(pos) );
} catch (Exception e) {
e.printStackTrace();
}
}
}
Pruebe AbsListView.performItemClick(...)
Consulte esta publicación sobre cómo usar performItemClick
.
Pruebe mListView.setSelection(position);
Puede usar ListView#setSelection(int)
Simplemente agregue la siguiente línea al diseño de su vista de lista personalizada:
android:background="?android:attr/activatedBackgroundIndicator"
Para un ejemplo completo de trabajo, vea:
package com.example.samsung;
import com.example.samsung.*;
import com.example.samsung.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;
public class Firstscreen extends Activity implements OnItemSelectedListener {
Button btn;
Spinner sp;
public String[] product = { "ML-1676P/XIP","SLM2021W/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M3320ND/XIP","SL-M3820ND/XIP","SL-M4020ND/XIP"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_firstscreen);
btn = (Button) findViewById(R.id.bn);
sp= (Spinner) findViewById(R.id.sp);
}
public void button (View v){
{
Intent i = new Intent(Firstscreen.this,ML1676P.class);
startActivity(i);
}
Spinner s1 = (Spinner) findViewById(R.id.sp);
ArrayAdapter<String> adapter
= new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, product); // find other layout parameters
s1.setAdapter(adapter);
s1.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
}
private Object product() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.firstscreen, menu);
return true;
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".Firstscreen"
android:orientation="vertical" >
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF35B5E5"
android:layout_centerInParent="true"
android:text="CHOOSE THE PRODUCT FROM THE LIST" />
<Spinner
android:id="@+id/sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:drawSelectorOnTop="true" />
<Button
android:id="@+id/bn"
android:layout_width="285dp"
android:layout_height="wrap_content"
android:text=" GO "
android:onClick="button"/>
</LinearLayout>
seleccione un elemento en una vista de lista que debe ir a la página del elemento seleccionado específico cuando se hace clic en el botón de cómo hacerlo. El código es un fragmento de arriba