estoy tratando de colocar un listview en el interior de un listviewitem. el interior de la listview no debe ser desplazable pero tomar todo el tamaño que necesita para mostrar todas las filas. hay una manera mejor de hacerlo? tabla, cuadrícula, …? el problema que estoy enfrentando ahora es que el interior de la listview no tomar el espacio que necesita, por lo que la corte a sobre el final de la primera listitem. si trato de desplazamiento, sólo el exterior listview es el desplazamiento que es exactamente lo que quiero.

android: listview en el listview
gracias, mi solución final es

LinearLayout layout = (LinearLayout) row.findViewById(R.id.LLBroadcasts);
layout.removeAllViews();

for (Item b : bs.getItems()) {

  View child = _inflater.inflate(R.layout.item_row, null);

  TextView tvTitle = (TextView) child.findViewById(R.id.TVItemTitle);
  tvTitle.setText(b.getTitle());

  TextView tvDesc = (TextView) child.findViewById(R.id.TVItemDescription);
  tvDesc.setText(b.getDescription());
  layout.addView(child);
}
  • Desde su descripción, usted no quiere una ListView dentro de un ListView, lo cual es bueno ya que no funcionará bien. En su lugar, desea vertical LinearLayout en el interior de su ListView filas, que se puede configurar de la misma manera que se haría con el resto de los contenidos de sus filas.
  • Tal vez puedes probar a utilizar un fragmento. Cada fragmento es de un listview, y usted puede agregar tantas fragmento como desee para crear un listview de listview!
  • sí, no quiero usar un listview en un listview. pero desde el interior-‘lo que es’ es una lista de uno a cuatro elementos (pueden ser diferentes de una fila a fila) necesito algún tipo de contenedor.
  • voy a mirar en fragmentos. parece que este enlace developer.android.com/guide/components/fragments.html#UI podría trabajar.
  • LinearLayout es un contenedor.
  • después de una prueba rápida me decidí a ir con @ChrLipp ‘s respuesta
  • Hay alguna forma de hacer esto de manera muy eficiente? es decir no quiero demasiados niños para el linearlayout y no quiero usar anidada pesos?
  • Que es imposible responder en abstracto.
  • Acabo de leer acerca de Epoxy una biblioteca por Airbnb… ¿sabe usted si la biblioteca es útil para el propósito?
  • Sólo si usted está usando RecyclerView. Esta pregunta es de hace varios años, y no se trata de RecyclerView.
  • Oops lo Siento, Sí, estoy usando un RecyclerView. Gracias por la comprensión.

InformationsquelleAutor kopi_b | 2012-07-25

5 Comentarios

  1. 38

    Desde el Android documentación – Listview: ListView es un grupo vista que muestra una lista de elementos desplazables

    Usted realmente no desea desplazarse interior a la vista de lista, se desea desplazar el exterior listview. Sin embargo he de asumir que el interior de la listview puede variar en la cantidad de elementos que contiene.

    Lugar de la lista interna de vista se podría utilizar una

    Para el esquema lineal (código de ejemplo):

    //access your linear layout
    LinearLayout layout = (LinearLayout)findViewById(R.id.layout);
    //load the xml structure of your row
    View child = getLayoutInflater().inflate(R.layout.row);
    //now fill the row as you would do with listview
    //e.g. (TextView) child.findViewById(...
    ...
    //and than add it
    layout.addView(child);

    Debe guardar el esquema lineal en una vista de titular (ver Ver Titular patrón). Creo que el removeAllViews() sólo es necesario cuando la fila actual tiene menor interior de las filas de la reutilizados, por lo que también guardar el número de filas en la vista de titular.

    Si el número máximo de interior filas no es alta puede pensar también en la caché de ellos en la vista de titular para evitar la inflar y findByViewId (digamos en un ArrayList).

  2. 6

    Tengo el mismo problema en mi Aplicación, pero que necesitaba usar un ListView causa fue un elemento compartido y no quería replicar la igualdad de los componentes. Así que.. me acaba de arreglar el tamaño de interior ListView a través de programación para mostrar todas las filas y.. voila! Problema resuelto:

    ViewGroup.LayoutParams layoutParams = innerListView.getLayoutParams();
    layoutParams.height = (int) context.getResources().getDimension(R.dimen.rowheight) * innerListView.getCount();
    innerListView.setLayoutParams(layoutParams);
    CustomAdapter adapter = new CustomAdapter(context, blabla..);
    innerListView.setAdapter(adapter);
    
    rowListView.invalidate();
    • a mí me funciona..
    • Gracias! A mí me funciona. Pero, todavía solución.
  3. 6

    Tal vez alguien encuentre mi solución útil.
    Se basa en @ChrLipp respuesta y utiliza LinearLayout.

    public class NotScrollableListView extends LinearLayout {
    private ListAdapter adapter;
    private DataChangeObserver dataChangeObserver;
    private Drawable divider;
    private int dividerHeight;
    private List<View> reusableViews = new ArrayList<>();
    public NotScrollableListView(Context context) {
    super(context);
    }
    public NotScrollableListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setAttributes(attrs);
    }
    public NotScrollableListView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setAttributes(attrs);
    }
    public ListAdapter getAdapter() {
    return adapter;
    }
    public void setAdapter(ListAdapter adapter) {
    if (this.adapter != null && dataChangeObserver != null) {
    this.adapter.unregisterDataSetObserver(dataChangeObserver);
    }
    this.adapter = adapter;
    }
    @Override
    protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    if (adapter != null) {
    dataChangeObserver = new DataChangeObserver();
    adapter.registerDataSetObserver(dataChangeObserver);
    fillContents();
    }
    }
    @Override
    protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if (adapter != null) {
    adapter.unregisterDataSetObserver(dataChangeObserver);
    dataChangeObserver = null;
    }
    }
    private void fillContents() {
    //clearing contents
    this.removeAllViews();
    final int count = adapter.getCount();   //item count
    final int reusableCount = reusableViews.size(); //count of cached reusable views
    //calculating of divider properties
    ViewGroup.LayoutParams dividerLayoutParams = null;
    if (divider != null && dividerHeight > 0) {
    dividerLayoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dividerHeight);
    }
    //adding items
    for (int i = 0; i < count; i++) {
    //adding item
    View converView = null;
    if (i < reusableCount) {    //we have cached view
    converView = reusableViews.get(i);
    }
    View view = adapter.getView(i, converView, this);
    if (i >= reusableCount) {   //caching view
    reusableViews.add(view);
    }
    addView(view);
    //adding divider
    if (divider != null && dividerHeight > 0) {
    if (i < count - 1) {
    ImageView dividerView = new ImageView(getContext());
    dividerView.setImageDrawable(divider);
    dividerView.setLayoutParams(dividerLayoutParams);
    addView(dividerView);
    }
    }
    }
    }
    private void setAttributes(AttributeSet attributes) {
    int[] dividerAttrs = new int[]{android.R.attr.divider, android.R.attr.dividerHeight};
    TypedArray a = getContext().obtainStyledAttributes(attributes, dividerAttrs);
    try {
    divider = a.getDrawable(0);
    dividerHeight = a.getDimensionPixelSize(1, 0);
    } finally {
    a.recycle();
    }
    setOrientation(VERTICAL);
    }
    private class DataChangeObserver extends DataSetObserver {
    @Override
    public void onChanged() {
    super.onChanged();
    fillContents();
    }
    @Override
    public void onInvalidated() {
    super.onInvalidated();
    fillContents();
    }
    }
    }
    <com.sample.ui.view.NotScrollableListView
    android:id="@+id/internalList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@color/list_divider_color"
    android:dividerHeight="@dimen/list_divider_width"
    />
    • Donde/Cuando se reusableViews de ser poblado?
    • lo siento, he editado mi respuesta
    • Yo actualmente uso el código y que hace que sea muy fácil tener un listview dentro de otra. Pero he estado tratando de implementar onItemClick para este interior listview y que funcionan bien en el exterior, y no he tenido ningún éxito en el momento. Consejos sobre cómo lograr esto?
    • usted podría tratar de usar stackoverflow.com/questions/15062365/… o stackoverflow.com/questions/3045872/…
    • no caché cualquier punto de vista.
    • ¿a qué te refieres?
    • Usted está caaching pero no reciclado, que es la misma que no se almacena en caché. De hecho, usted también está de reciclaje, pero Para n elemento de n puntos de vista son necesarios.

  4. 0

    @Trate de esta clase anidada

    esto funciona para desplazarse listView dentro de listView O 2 listviews en la misma activity

            <com.example.taskgrptaskslistview.NestedListView
    android:id="@+id/listviewTasks"
    android:layout_width="0dip"
    android:layout_height="wrap_content"
    android:layout_marginBottom="2dp"
    android:layout_weight="1"
    android:cacheColorHint="#00000000" >
    </com.example.taskgrptaskslistview.NestedListView>
    </LinearLayout>

    NestedListView :

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.ViewGroup;
    import android.widget.AbsListView;
    import android.widget.AbsListView.OnScrollListener;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    public class NestedListView extends ListView implements OnTouchListener, OnScrollListener {
    private int listViewTouchAction;
    private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99;
    public NestedListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    listViewTouchAction = -1;
    setOnScrollListener(this);
    setOnTouchListener(this);
    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
    int visibleItemCount, int totalItemCount) {
    if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
    if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
    scrollBy(0, -1);
    }
    }
    }
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int newHeight = 0;
    final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    if (heightMode != MeasureSpec.EXACTLY) {
    ListAdapter listAdapter = getAdapter();
    if (listAdapter != null && !listAdapter.isEmpty()) {
    int listPosition = 0;
    for (listPosition = 0; listPosition < listAdapter.getCount()
    && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) {
    View listItem = listAdapter.getView(listPosition, null, this);
    //now it will not throw a NPE if listItem is a ViewGroup instance
    if (listItem instanceof ViewGroup) {
    listItem.setLayoutParams(new LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
    listItem.measure(widthMeasureSpec, heightMeasureSpec);
    newHeight += listItem.getMeasuredHeight();
    }
    newHeight += getDividerHeight() * listPosition;
    }
    if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) {
    if (newHeight > heightSize) {
    newHeight = heightSize;
    }
    }
    } else {
    newHeight = getMeasuredHeight();
    }
    setMeasuredDimension(getMeasuredWidth(), newHeight);
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
    if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
    scrollBy(0, 1);
    }
    }
    return false;
    }
    }
  5. 0

    Traté de hacer esta estructura exacta (un ListView dentro de un ListView) y tenía el mismo problema de que sólo se muestra el primer punto del interior ListView. Me fijo por el cambio de la layout_height de la lista interna de match_parent a un conjunto dp.

    Parecía funcionar exactamente como yo quería.

    • no funciona para mí. El innerListView es todavía unscrollable. Cuando me tratan de desplazarse en el InnerListView, me desplazo en el padre ListView…
    • Debo especificar que mi interior la vista de lista es en realidad dentro de un esquema lineal, el cual está dentro de la parte exterior de la vista de lista
    • ok voy a intentar. Volveré cuando se hace

Dejar respuesta

Please enter your comment!
Please enter your name here