2011-10-05 12 views
11

Ho un layout. Questo layout contiene 3 viste elenco con l'altezza dei dati wrap_content in Listview non sono risolti. Quando Listview ha un enorme numero di dati in quel momento, i dati passano da sotto e i dati non sono in grado di vedere, quindi voglio scorrere la vista con tutte e tre le Listview come è possibile.Come scorrere il layout che ha 3 visualizzazione elenco

Qualcuno ha un'idea a riguardo?

Questa è la mia opinione che contiene 3 Listview, ora è con meno dati ma quando i dati diventeranno enormi in quel momento l'ultima Listview ha un problema da visualizzare. Voglio scorrere la vista di colore grigio ...

enter image description here

risposta

7

Usa layout lineare invece di listview nel file xml. Questo è il tuo file xml.

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView android:id="@+id/scr" android:layout_height="fill_parent" 
    android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <LinearLayout android:layout_width="fill_parent" 
     android:id="@+id/r2" android:orientation="vertical" 
     android:layout_height="fill_parent" android:paddingTop="100dip" 
     android:paddingBottom="100dip"> 
     <LinearLayout android:layout_width="fill_parent" 
      android:id="@+id/l1" android:orientation="vertical" 
      android:layout_height="wrap_content" android:layout_marginTop="10dip" 
      android:background="#00B2EE"> 
     </LinearLayout> 
     <LinearLayout android:layout_width="fill_parent" 
      android:id="@+id/l2" android:orientation="vertical" 
      android:layout_height="wrap_content" android:layout_marginTop="10dip" 
      android:background="#00EE76"> 

     </LinearLayout> 
     <LinearLayout android:layout_width="fill_parent" 
      android:id="@+id/l3" android:orientation="vertical" 
      android:layout_height="wrap_content" android:layout_marginTop="10dip" 
      android:background="#7171C6"> 
     </LinearLayout> 
    </LinearLayout> 
</ScrollView> 

e inserire un altro xml che verrà gonfiato dalla lista.

questa è la tua classe di attività principale.

package com.list.add; 

import java.util.ArrayList; 
import java.util.List; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.ScrollView; 
import android.widget.TextView; 

public class NewlistActivity extends Activity { 
    /** Called when the activity is first created. */ 
    LinearLayout l1,l2,l3; 
    ScrollView scrollView; 
    ViewGroup contentView; 
    List<String> list = new ArrayList<String>(); 
    List<String> list1 = new ArrayList<String>(); 
    List<String> list2 = new ArrayList<String>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     l1 = (LinearLayout) findViewById(R.id.l1); 
     l2 = (LinearLayout) findViewById(R.id.l2); 
     l3 = (LinearLayout) findViewById(R.id.l3); 
     scrollView = (ScrollView) findViewById(R.id.scr); 
     contentView = (ViewGroup) findViewById(R.id.r2); 
     scrollView.setOnTouchListener(new ScrollPager(scrollView, contentView)); 
     scrollView.post(new Runnable() { 
      public void run() { 
       scrollView.scrollTo(0, contentView.getPaddingTop()); 
      } 
     }); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Shah"); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Shah"); 

     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 

     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     System.out.println(list); 
     System.out.println(list1); 
     System.out.println(list2); 
     for (int i=0; i<list.size(); i++) 
     { 
     LayoutInflater inflater = getLayoutInflater(); 
     View vi = inflater.inflate(R.layout.raw, null); 
     TextView tv = (TextView) vi.findViewById(R.id.textView1); 
     tv.setText(list.get(i)); 
     l1.addView(vi); 
     } 
     for (int i=0; i<list1.size(); i++) 
     { 
     LayoutInflater inflater = getLayoutInflater(); 
     View vi = inflater.inflate(R.layout.raw, null); 
     TextView tv = (TextView) vi.findViewById(R.id.textView1); 
     tv.setText(list1.get(i)); 
     l2.addView(vi); 
     } 
     for (int i=0; i<list2.size(); i++) 
     { 
     LayoutInflater inflater = getLayoutInflater(); 
     View vi = inflater.inflate(R.layout.raw, null); 
     TextView tv = (TextView) vi.findViewById(R.id.textView1); 
     tv.setText(list2.get(i)); 
     l3.addView(vi); 
     } 
    } 

} 

e fare una classe scroller come questo:

public class ScrollPager implements OnTouchListener 
public ScrollPager(ScrollView aScrollView, ViewGroup aContentView) 
    { 
     mScrollView = aScrollView; 
     mContentView = aContentView; 
     scroller = new Scroller(mScrollView.getContext(), new OvershootInterpolator()); 
     task = new Runnable() 
     { 
      public void run() 
      { 
       scroller.computeScrollOffset(); 
       mScrollView.scrollTo(0, scroller.getCurrY()); 

       if (!scroller.isFinished()) 
       { 
        mScrollView.post(this); 
       } 
      } 
     }; 
    } 
public boolean onTouch(View v, MotionEvent event) 
    { 
     // Stop scrolling calculation. 
     scroller.forceFinished(true); 
     // Stop scrolling animation. 
     mScrollView.removeCallbacks(task); 

     if (event.getAction() == MotionEvent.ACTION_UP) 
     { 
+0

Questo funziona per me. Capisco che potrebbe non essere la memoria più efficiente in quanto dovremo farlo esplicitamente ecc., Ma nel mio caso non sto usando più di 5 articoli quindi sono bravo. Grazie – lazyguy

1

Si dovrebbe usare il peso attributo android:layout_weight="1" in ogni ListView nel layout XML. In modo che divida lo schermo con lo spazio uguale per ogni listview e lo scorrimento funzionerà per ogni ListView.

+0

ciao Sujit ma io uso il layout relativo a che l'androide: immobile layout_weight non è supportato. –

+0

perché stai utilizzando RelativeLayout? Qualche ragione specifica? Dovresti usare LinearLayout perché hai 3 listView allineati verticalmente ??? – Sujit

+0

ma il design dell'applicazione è importante con questa vista, quindi ho bisogno di questo design nel relativo layout. –

1

Se si presentano oggetti in una pila verticale o orizzontale, è necessario utilizzare LinearLayout e quindi utilizzare l'attributo layout_weight per controllare le proporzioni delle singole righe/colonne all'interno del contenitore.

Se volete schermo di dimensioni, impostare il layout_width e layout_height a fill_parent altrimenti non sarà possibile ottenere tutte le dimensioni dello schermo disponibile. Se provi a usare wrap_content per l'altezza, tutto crollerà, a meno che non ricorra a ulteriori vincoli di layout, ad es. minHeight.

Lo usiamo ovunque ed è abbastanza affidabile. Per tre articoli, è possibile utilizzare 1/1/1 o 3/3/3.

Anche i pesi non devono essere uguali! Puoi dividere le proporzioni come preferisci; i pesi sono solo i rapporti relativi dell'intero intervallo (larghezza/altezza). Per esempio. se si desidera che l'elemento centrale sia il doppio della dimensione, utilizzare 1/2/1; se lo desideri il 40% usa 30/40/30 o 3/4/3.

Un buon "trucco" è quello di utilizzare layout_weight = 1 su esattamente una riga/colonna (altri di default su zero), e "riempire" qualsiasi spazio rimanente. Questo è uno scenario di layout comune.

Se è necessario scorrere lo stack, è possibile inserirlo in un ScrollView. In questo caso, è necessario impostare layout_height su LinearLayout su wrap_content e sarà soggetto a collassare in base al capriccio del sistema di layout (ovvero è necessario utilizzare quindi i limiti min/max).

1

Invece, mi permetta di dare il mio migliore idea per lo stesso tipo di implementazione.

Avete mai pensato di utilizzare lo ExpandableListView per lo stesso tipo di implementazione? Basta mostrare la prima voce del gruppo come espansa e rendere crollati altri 2 gruppi, basta espanderla quando l'utente fa clic sul particolare gruppo.

Ecco alcuni esempi per la stessa:

  1. http://techdroid.kbeanie.com/2010/09/expandablelistview-on-android.html
  2. http://coderzheaven.com/2011/04/expandable-listview-in-android-using-simpleexpandablelistadapter-a-simple-example/

Sono sicuro che questa idea non è buona, ma se si sceglie di implementare questo allora avrete sicuramente trovato benefici nel vostro Astuccio.

1

Utilizzare questo metodo e il vostro ListView diventare scorrevole all'interno ScrollView: -

ListView lstNewsOffer.setAdapter(new ViewOfferAdapter(
         ViewNewsDetail.this, viewOfferList)); 
       getListViewSize(lstNewsOffer); 

void getListViewSize(ListView myListView) { 
ListAdapter myListAdapter = myListView.getAdapter(); 
if (myListAdapter == null) { 
    // do nothing return null 
    return; 
} 
// set listAdapter in loop for getting final size 
int totalHeight = 0; 
for (int size = 0; size < myListAdapter.getCount(); size++) { 
    View listItem = myListAdapter.getView(size, null, myListView); 
    listItem.measure(0, 0); 
    totalHeight += listItem.getMeasuredHeight(); 
} 
// setting listview item in adapter 
ViewGroup.LayoutParams params = myListView.getLayoutParams(); 
params.height = totalHeight 
     + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1)); 
myListView.setLayoutParams(params); 
// print height of adapter on log 
Log.i("height of listItem:", String.valueOf(totalHeight)); 

}

Problemi correlati