2011-10-05 27 views
11

Tôi có một bố cục. Bố cục này chứa 3 dạng xem danh sách với chiều cao của dữ liệu wrap_content trong ListView không được sửa. Khi Listview có một dữ liệu khổng lồ liitel tại thời điểm đó dữ liệu đi vào bên dưới và dữ liệu không thể nhìn thấy, vì vậy tôi muốn cuộn chế độ xem với cả ba Listview như thế nào nó có thể.Cách cuộn bố cục có 3 chế độ xem danh sách

Bất kỳ ai có ý tưởng về điều này?

Đây là chế độ xem của tôi chứa 3 Listview, giờ đây với ít dữ liệu hơn nhưng khi dữ liệu sẽ trở nên lớn vào thời điểm đó thì Chế độ xem toàn cảnh cuối cùng có vấn đề cần xem. Tôi muốn di chuyển các điểm màu xám ...

enter image description here

Trả lời

7

Sử dụng bố cục tuyến tính thay vì listview trong tệp xml của bạn. Đây là tệp xml của bạn.

<?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> 

và đặt xml khác sẽ được tăng thêm theo danh sách.

đây là lớp hoạt động chính của bạn.

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

} 

và làm cho một lớp cuộn như thế này:

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

Điều này làm việc cho tôi. Tôi hiểu nó có thể không phải là bộ nhớ hiệu quả nhất vì chúng tôi sẽ phải làm điều đó một cách rõ ràng, nhưng trong trường hợp của tôi, tôi không sử dụng nhiều hơn 5 mục vì vậy tôi tốt. Cảm ơn – lazyguy

1

Bạn nên sử dụng trọng lượng thuộc tính android:layout_weight="1" trong mỗi ListView trong cách bố trí XML. Vì vậy, nó sẽ chia màn hình với không gian bằng nhau cho mỗi listview và di chuyển của bạn sẽ làm việc cho mỗi ListView.

+0

chào Sujit nhưng tôi sử dụng cách bố trí tương đối trong đó android: tài sản layout_weight là không hỗ trợ. –

+0

tại sao bạn sử dụng RelativeLayout? Có lý do cụ thể nào không? Bạn nên sử dụng LinearLayout vì bạn có 3 listView được căn chỉnh theo chiều dọc ??? – Sujit

+0

nhưng thiết kế của ứng dụng quan trọng với quan điểm này vì vậy tôi cần thiết kế này trong bố trí tương đối .. –

1

Nếu bạn đang trình bày nội dung trong ngăn xếp theo chiều dọc hoặc ngang, bạn nên sử dụng LinearLayout và sau đó sử dụng thuộc tính layout_weight để kiểm soát tỷ lệ của các hàng/cột riêng lẻ trong vùng chứa.

Nếu bạn muốn kích thước màn hình, hãy đặt layout_widthlayout_height thành fill_parent nếu không bạn sẽ không nhận được tất cả thứ nguyên màn hình có sẵn. Nếu bạn cố gắng sử dụng wrap_content để có chiều cao, mọi thứ sẽ sụp đổ, trừ khi bạn sử dụng các ràng buộc bố cục bổ sung, ví dụ: minHeight.

Chúng tôi sử dụng ở mọi nơi và nó khá đáng tin cậy. Đối với ba mục, bạn có thể sử dụng 1/1/1 hoặc 3/3/3.

Các trọng số cũng không phải bằng nhau! Bạn có thể chia tỷ lệ theo bất kỳ cách nào bạn muốn; trọng số chỉ là tỷ lệ tương đối của toàn bộ khoảng (chiều rộng/chiều cao). Ví dụ. nếu bạn muốn phần tử ở giữa có kích thước gấp đôi, hãy sử dụng 1/2/1; nếu bạn muốn nó 40% sử dụng 30/40/30 hoặc 3/4/3.

Bí quyết "tốt" là sử dụng layout_weight = 1 trên chính xác một hàng/cột (số khác mặc định bằng 0) và sẽ "điền vào" bất kỳ dung lượng còn lại nào. Đây là một kịch bản bố cục chung.

Nếu bạn cần ngăn xếp để cuộn, bạn có thể đặt nó vào một ScrollView. Trong trường hợp này, bạn phải đặt layout_height của LinearLayout thành wrap_content và bạn sẽ bị thu hẹp tùy thuộc vào ý thích của hệ thống bố cục (nghĩa là bạn cần sử dụng các ràng buộc tối thiểu/tối đa).

1

Thay vào đó, tôi xin trình bày ý tưởng hết sức mình cho cùng một loại thực hiện.

Bạn đã bao giờ nghĩ sử dụng ExpandableListView cho cùng một loại triển khai không? Chỉ hiển thị mục nhóm 1 như được mở rộng và làm cho 2 nhóm khác được thu gọn, chỉ cần mở rộng khi người dùng nhấp vào nhóm cụ thể.

Dưới đây là một số ví dụ cho cùng:

  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/

Tôi chắc chắn ý tưởng này là không tốt nhưng nếu bạn thực hiện điều này thì bạn sẽ chắc chắn tìm thấy có lợi trong của bạn trường hợp.

1

Sử dụng phương pháp này và listview của bạn trở nên cuộn bên 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)); 

}

Các vấn đề liên quan