¿Por qué mi ListView no muestra nada?
Tengo un ListView muy básico en androide y había fijado un adaptador muy básico. Mi problema es que la vista de lista no muestra nada, sin importar el adaptador y el notifyDataSetChanged ();
Aquí está mi código: XML:
- Layout_width de un ListView
- ¿Cómo cargar datos del servidor al listview cuando se desplaza?
- ListView No puedo hacer referencia en R.id.list?
- Android: los elementos no habilitados de ListView dibujan un divisor invisible
- Aplicación de la burbuja de chat de Android en ListView
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" ></TextView> <ListView android:id="@+id/selectView" android:layout_height="wrap_content" android:layout_width="wrap_content"> </ListView> </RelativeLayout>
El código de actividad:
import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import com.androidcourse.phonemapper.R; import com.androidcourse.phonemapper.model.SelectViewAdapter; public class SelectActivity extends Activity { private ListView mListView; private SelectViewAdapter mAdapter; @Override public void onCreate(Bundle savedState) { super.onCreate(savedState); setContentView(R.layout.select_activity); initializeListView(); } private void initializeListView() { mListView = (ListView) findViewById(R.id.selectView); mAdapter = new SelectViewAdapter(this); mListView.setAdapter(mAdapter); mAdapter.notifyDataSetChanged(); } @Override public void onResume() { super.onResume(); } }
Y el código del adaptador:
import android.content.Context; import android.graphics.Color; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class SelectViewAdapter extends BaseAdapter { private Context mContext; private TextView mMockTextView; public SelectViewAdapter(Context cnt) { mContext = cnt; mMockTextView = new TextView(mContext); mMockTextView.setText("Test text"); mMockTextView.setBackgroundColor(Color.CYAN); } @Override public int getCount() { return 3; } @Override public Object getItem(int position) { return mMockTextView; } @Override public long getItemId(int position) { return 3; } @Override public View getView(int position, View convertView, ViewGroup parent) { return mMockTextView; } }
El problema es que no se muestra nada en la pantalla. Una pantalla negra (y la primera vista de texto desde el XML) es todo lo que consigo. No puedo ver el mockTextView y su texto. Al parecer estoy haciendo algo muy mal, pero no puedo entender qué.
- setEmptyView en ListView no funciona
- Android: cómo cambiar la posición de ExpandableListView Indicator?
- ListView onItemLongClickListener no impide que los grifos de enlace
- OpenGLRenderer, se encontró el glifo no válido
- Diferencia entre RowId y Position en el parámetro onItemLongClick
- El ListView de fondo se vuelve negro al desplazarse
- Encabezados ListView de Android
- Lista personalizada con dos botones en cada fila
Puedo pensar en algunas cosas.
En primer lugar, su RelativeLayout no tiene información relativa de posicionamiento. Asumiría que usted significó poner esto en un LinearLayout con la orientación fijada a vertical de lo que usted describe. Mi conjetura es que la lista no se está dibujando realmente puesto que no es anclada incluso a nada en el actual RelativeLayout. Si te quedas con el RelativeLayout, asegúrate de poner un id en el nombre de la aplicación TextView y colocar el ListView debajo de él a través de layout_below.
Solución LinearLayout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" ></TextView> <ListView android:id="@+id/selectView" android:layout_height="wrap_content" android:layout_width="wrap_content"> </ListView> </LinearLayout>
Solución RelativeLayout:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/app_name_text" android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" ></TextView> <ListView android:id="@+id/selectView" android:layout_below="@id/app_name_text" android:layout_height="wrap_content" android:layout_width="wrap_content"> </ListView> </RelativeLayout>
A continuación, getView () devuelve el mismo textView para los 3 índices. No es un problema para mostrar la misma vista sobre varios índices sin embargo, con un tamaño de lista de tres, estoy apostando que la pantalla puede mostrar los tres al mismo tiempo. Y puesto que una visión no puede estar en más de una posición a la vez, en realidad esperaría que esto fallara así que dudo que esté incluso consiguiendo a este código todavía. Intente crear un nuevo TextView para cada getView (). Además, su MockTextView no tiene parámetros de diseño propios. Por lo tanto, colocarlo dentro de una célula listView podría no estar ocurriendo. Así que puede darle params de tipo AbsListView.LayoutParams (WRAP_CONTENT, WRAP_CONTENT). Nuevamente, aunque esperaría que esto fuera un error si llegara al código original.
GetView () ordenar:
@Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { TextView textView = new TextView(parent.getContext()); textView.setText("Position is:"+position); textView.setBackgroundColor(Color.CYAN); textView.setLayoutParams(new AbsListView.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); convertView = textView; } return mMockTextView; }
Y por último, la altura wrap_content de su lista a veces puede ser problemática. No soy consciente de todos los escenarios. Si terminas cambiando a un LinearLayout, intenta establecer el layout_height de la vista de lista en 0 y luego establecer el layout_weight = 1. Esto obliga al diseño lineal a inflarlo en más espacio.
LinearLayout Peso Solución:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:text="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" ></TextView> <ListView android:id="@+id/selectView" android:layout_weight="1" android:layout_height="0dp" android:layout_width="wrap_content"> </ListView> </LinearLayout>
Yo estaba usando el ejemplo de enlace de datos del libro Hola Android de Ed Burnette (gran libro).
Cambié la disposición del artículo de A RelativeLayout a LinearLayout; Sin embargo, no agregué una orientación cuando hice el cambio.
Una vez que agregué android: orientation = "vertical" todo funcionó bien.
Dos horas de mi vida en esta.
Si bien no responde a esta pregunta, un problema típico es inflar como un recurso de adaptador un diseño basado en un Parent LinearLayout con height = wrap_content y cada elemento LinearLayout con height = fill_parent.
Como en
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parentLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/someText" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1"/>
Mientras se muestra bien en Eclipse, cada fila termina con height = 0. Esto se puede arreglar estableciendo height = wrap_content para uno de los elementos secundarios
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parentLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/someText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/>
- Obtener el permiso de publish_action después de obtener permisos de lectura de Facebook
- Cómo puedo recibir notificaciones de GCM cuando se detiene la aplicación