Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Utilizar adaptador de matriz con más vistas en fila en listview

Me he tropezado con un problema que no puedo conseguir mi cabeza, así que esperaba que tal vez alguien aquí han tenido el mismo problema o sabía una buena manera de resolver el problema.

He creado una vista que contiene un ListView. Este ListView contiene dos TextView. El problema es que no sé dónde enviar los valores que están destinados a ir en la segunda vista de texto utilizando el ArrayAdapter. ¿Hay una manera de enviar con más información al ArrayAdapter para poder alimentar el "todaysmenu" TextView?

  • Pulsar el botón de clic dentro de una fila en RecyclerView
  • Cuándo cancelar una suscripción
  • La base de datos no se eliminará cuando desinstale la aplicación de Android
  • Bloquear la orientación de la pantalla (Android)
  • Sugerencias para evitar errores de mapa de bits de memoria
  • Cola completa, perder evento en Android Emulator
  • El método ArrayAdapter:

    private void createList() { ListView lv = (ListView) findViewById(R.id.mylist); String[] values = new String[] { "Android", "Linux", "OSX", "WebOS", "Windows7", "Ubuntu", "OS/2" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowlayout, R.id.restaurantname, values); lv.setAdapter(adapter); } 

    El marcado de fila:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/restaurantname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@+id/restaurantname" android:textSize="23dp" > </TextView> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@+id/todaysmenu" /> </LinearLayout> 

    El diseño de la actividad:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/mylist" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout> 

    Al principio conseguí todo para trabajar, pero cuando agregué el segundo problema de campo de texto despertar. ¡Por adelantado, gracias por su ayuda!

  • En Android M, ¿cómo configurar las capacidades de "compartir directamente" (imagen, texto) y cómo consultar los elementos?
  • Que puede reemplazar la función capturePicture
  • ¿Por qué R no existe error viene en android?
  • La vista no puede anclarse en el parámetro CoordinatorLayout principal
  • Listener ya en uso (Service Discovery)
  • Android no cambia el tamaño de mi diseño cuando hay un NestedScrollView en la jerarquía
  • 4 Solutions collect form web for “Utilizar adaptador de matriz con más vistas en fila en listview”

    Para lograr esto, tiene que construir un adaptador personalizado e inflar su diseño de fila personalizado. El uso de ArrayAdapter no funcionará porque

    De forma predeterminada, esta clase espera que el identificador de recurso proporcionado haga referencia a una sola TextView. Si desea utilizar un diseño más complejo, utilice los constructores que también toman un ID de campo. Ese identificador de campo debe hacer referencia a un TextView en el recurso de diseño más grande.

    Por lo tanto, su clase de adaptador personalizado podría ser somthing como:

     public class CustomAdapter extends ArrayAdapter { private final Activity activity; private final List list; public CustomAdapter(Activity activity, ArrayList<Restaurants> list) { this.activity = activity; this.list = list; } @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; ViewHolder view; if(rowView == null) { // Get a new instance of the row layout view LayoutInflater inflater = activity.getLayoutInflater(); rowView = inflater.inflate(R.layout.rowlayout, null); // Hold the view objects in an object, that way the don't need to be "re- finded" view = new ViewHolder(); view.retaurant_name= (TextView) rowView.findViewById(R.id.restaurantname); view.restaurant_address= (TextView) rowView.findViewById(R.id.textView1); rowView.setTag(view); } else { view = (ViewHolder) rowView.getTag(); } /** Set data to your Views. */ Restaurants item = list.get(position); view.retaurant_name.setText(item.getTickerSymbol()); view.restaurant_address.setText(item.getQuote().toString()); return rowView; } protected static class ViewHolder{ protected TextView retaurant_name; protected TextView restaurant_address; } } 

    Y su clase de Restaurant.java podría ser tan simple como describo a continuación:

     public class Restaurants { private String name; private String address; public Restaurants(String name, String address) { this.name = name; this.address = address; } public void setName(String name) { this.name= name; } public String getName() { return name; } public void setAddress(String address) { this.address= address; } public String getAddress() { return address; } } 

    Ahora, en su actividad principal sólo le vinculan lista con algunos datos, como;

     /** Declare and initialize list of Restaurants. */ ArrayList<Restaurants> list = new ArrayList<Restaurants>(); /** Add some restaurants to the list. */ list.add(new Restaurant("name1", "address1")); list.add(new Restaurant("name2", "address2")); list.add(new Restaurant("name3", "address3")); list.add(new Restaurant("name4", "address4")); list.add(new Restaurant("name5", "address5")); list.add(new Restaurant("name6", "address6")); 

    En este punto, puede configurar el adaptador personalizado en su lista

     ListView lv = (ListView) findViewById(R.id.mylist); CustomAdapter adapter = new CustomAdapter(YourMainActivityName.this, list); lv.setAdapter(adapter); 

    Esto es todo y debe funcionar muy bien, pero te recomiendo encarecidamente que Google para algunas mejores alternativas para implementar otros adaptadores .

    Puede probar esta https://devtut.wordpress.com/2011/06/09/custom-arrayadapter-for-a-listview-android/ . Debe crear un elemento de clase personalizado con los campos que necesita y extender ArrayAdapter .

    Creo que su problema está aquí:

    En lugar de esto:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/restaurantname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@+id/restaurantname" android:textSize="23dp" > </TextView> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@+id/todaysmenu" /> </LinearLayout> 

    Intente algo como esto:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/restaurantname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="test text" android:textSize="23dp" > </TextView> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test text" /> </LinearLayout> 

    Si eso funciona, entonces coloque su texto en la carpeta / res / val / string de la siguiente manera:

     <string name="testText">Put your text here...</string> 

    Y luego llamar así:

      <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/restaurantname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/testText" android:textSize="23dp" > </TextView> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/testText" /> </LinearLayout> 

    A continuación, establecería los valores dinámicos de la siguiente manera:

     TextView tv = (TextView)findViewById(R.id.restaurantname); tv.setText(values); 

    Tuve que resolver el mismo problema y trató de utilizar el arrayadapter como se ha respondido anteriormente, pero no funcionó.

    Más tarde lo conseguí con baseadapter – este es el adaptador:

     public class BusinessAdapter2 extends BaseAdapter { private final ArrayList<Business> myList; LayoutInflater inflater; Context context; public BusinessAdapter2(Context context, ArrayList<Business> myList) { this.myList = myList; this.context = context; inflater = LayoutInflater.from(this.context); } @Override public int getCount() { return myList.size(); } @Override public Object getItem(int position) { return myList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView==null) convertView = inflater.inflate(R.layout.business_list_item_2, parent, false); // assign the view we are converting to a local variable View v = convertView; Business b = myList.get(position); if (b != null) { TextView name = (TextView) v.findViewById(R.id.textview_name); TextView address = (TextView) v.findViewById(R.id.textview_address); TextView description = (TextView) v.findViewById(R.id.textview_description); TextView discount = (TextView) v.findViewById(R.id.textview_discount); // check to see if each individual textview is null. // if not, assign some text! if (name != null){ name.setText(b.name); } if (address != null){ address.setText(b.address); } if (description != null){ description.setText(b.description); } if (discount != null){ discount.setText(b.discountRate); } } // the view must be returned to our activity return v; } } 

    Esta es la clase de objeto que utilicé (Business):

     public class Business { String name,address,description,discountRate; public Business(){} public Business(String name,String address,String description,String discountRate){ this.name=name; this.address=address; this.description=description; this.discountRate=discountRate; } } 

    Y esto es cómo lleno el listview en el adaptador:

     ArrayList<Business> businesses2=new ArrayList<Business>(Arrays.asList(for_listview_objects)); adapter_objects =new BusinessAdapter2( context, // The current context (this activity) businesses2); listView.setAdapter(adapter_objects); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.