2011-10-05 8 views
11

レイアウトは1つです。このレイアウトには、Listview内のwrap_contentデータの高さを指定した3つのリストビューが含まれています。その時点でリストビューに大量のデータがあると、データが下になり、データを見ることができないので、3つすべてのリストビューでスクロールしたいと考えています。3リストビューを持つレイアウトをスクロールする方法

誰でもこれについて考えていますか?

これは、3つのリストビューを含む私のビューです。データは少なくなりましたが、その時点でデータが大きくなると、最後のリストビューに問題があります。私は、あなたがXMLレイアウトで各リストビューで体重属性android:layout_weight="1"を使用する必要があります

enter image description here

答えて

7

xmlファイルでlistviewの代わりに線形レイアウトを使用します。 これはあなたの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> 

リストを膨らませる別のxmlを入れてください。

これは主なアクティビティクラスです。

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); 
     } 
    } 

} 

と、このような1つのスクロールクラスを作る:

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

これは私のために働きます。私たちはそれを明示的に行う必要があるので、それはほとんどのメモリ効率的ではないかもしれないと理解していますが、私は5つ以上の項目を使用していないので、私は良いです。ありがとう – lazyguy

1

...灰色のビューをスクロールします。これにより、各リストビューの画面が等間隔で分割され、各ListViewのスクロールが機能します。

+0

ハローsujitが、私はそのアンドロイドの相対的なレイアウトを使用します。layout_weightプロパティがサポートされていません。 –

+0

なぜRelativeLayoutを使用していますか?具体的な理由は何ですか? LinearLayoutを使用する必要があります。なぜなら3つのリストビューが垂直に整列しているからです。 – Sujit

+0

しかし、このビューではアプリケーションのデザインが重要なので、相対レイアウトでこのデザインが必要です。 –

1

物を縦または横に積み重ねて提示する場合は、LinearLayoutを使用してからlayout_weight属性を使用して、コンテナ内の個々の行/列の比率を制御する必要があります。

layout_widthlayout_heightfill_parentに設定すると、使用可能な画面のサイズがすべて取得されません。高さにwrap_contentを使用しようとすると、追加のレイアウト制約に頼らない限り、すべてが崩壊します。 minHeight

私たちはどこでもこれを使用しており、かなり信頼性があります。 3つの項目については、1/1/1または3/3/3を使用できます。

ウェイトも同じである必要はありません。割合を任意の方法で分割することができます。ウェイトはスパン全体の相対的な比率(幅/高さ)にすぎません。例えば。中間の要素を2倍にしたい場合は1/2/1を使います。あなたがそれを40%使用したい場合は30/40/30または3/4/3を使用してください。

良い "トリック"は、正確に1つの行/列(他はデフォルトで0)にlayout_weight = 1を使用することです。残りのスペースはすべて "埋め込み"ます。これは一般的なレイアウトのシナリオです。

スタックをスクロール可能にする必要がある場合は、ScrollViewに入れることができます。この場合、LinearLayoutlayout_heightwrap_contentに設定する必要があります。レイアウトシステムの使い分けに応じて折りたたまれます(最小/最大の制約を使用する必要があります)。

1

代わりに、私は実装の同じ種類のための私の最高のアイデアを与えてみましょう。

ExpandableListViewを同じ種類の実装に使用することを考えたことはありますか? 1つ目のグループ項目を展開して表示し、他の2つのグループを折りたたんで、ユーザーが特定のグループをクリックしたときに展開します。ここで

は同じのためのいくつかの例は以下のとおりです。

  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/

私はこのアイデアが良くないと確信していますが、これを実装するならば、あなたは必ずあなたに有益であることが分かっます場合。

1

このメソッドを使用して、リストビューは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)); 

}

関連する問題