2010-07-07 41 views
16

Tôi đang cố gắng tạo bố cục tương tự như cách thị trường Android ... nơi nói theo nhận xét có vẻ như là ListView nhưng không cuộn (cuộn toàn bộ trang nhưng không phải là nhận xét) . Tôi không chắc chắn nếu nó thậm chí là một ListView nhưng tôi muốn một cái gì đó trông giống như danh sách xem (ví dụ: có những thanh chia và những gì không nhưng không SCROLLABLE). Có những người đề nghị sử dụng LinearLayout thay vì ListView nhưng tôi cũng muốn các mục có thể nhấp và mở hoạt động mới. Hãy giúp tôi?Android ListView không cuộn?

cây bố trí hiện tại của tôi là như vậy

<LinearLayout> 
    <ScrollView> 
    <RelativeLayout> 

tôi tìm cách để đưa nội dung bên trong RelativeLayout.

Trả lời

28

Theo giải thích của các lập trình viên đã làm listView trong này video từ GoogleIo không bao giờ đặt một ListView bên trong một dạng xem cuộn. Nếu danh sách của bạn không nên cuộn sử dụng một ViewGroup như một Layout tuyến tính và thêm tất cả các mục vào ViewGroup này trong một vòng lặp trong mã của bạn. Nếu bạn muốn toàn bộ hàng có thể nhấp được, bạn phải sử dụng một ViewGroup khác làm nút gốc cho mỗi hàng và thêm OnClickListener vào Chế độ xem này.

Sample Code:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

for (int current = 0; current < itemCount; current++) { 
    View view = inflater.inflate(R.layout.layout_id, parent, false); 

    //initialize the view 

    view.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(getApplicationContext(), CLASS_TO_START) 
      startActivity(intent); 
     } 
    }); 
    viewGroup.addView(view); 
    if (current < itemCount - 1) { 
     inflater.inflate(R.layout.line, viewGroup); 
    } 
} 

Mã này sẽ tạo ra một Xem cho tất cả các mục mà bạn có và đặt nó vào ViewGroup. Sau mỗi mục nhưng cuối cùng nó cũng sẽ thêm một chia cho viewGroup.

+1

thanks =) Tôi đã kết thúc bằng cách sử dụng phương pháp này sau khi tìm hiểu LayoutInflater là gì và cách sử dụng nó ... bây giờ tôi chỉ phải làm mọi thứ trong xml. – Kman

+4

Câu hỏi nhanh ... làm cách nào để làm cho Chế độ xem nổi bật khi tôi nhấp vào? – Kman

+0

@Kman Tôi biết đây là một bài đăng cũ, nhưng bạn có biết cách đánh dấu chế độ xem con sau khi đã được nhấp không? –

0

Bạn có thể tạo một ListView và đặt tất cả bên trong, vì vậy toàn bộ trang sẽ cuộn. Bạn có thể triển khai thực hiện bộ điều hợp của riêng mình, nhưng tôi khuyên bạn nên sử dụng tuyệt vời của CommonsWare MergeAdapter Bạn có thể thêm nhãn hoặc thanh phân cách với addView() và các danh sách có addAdapter(). Kiểm tra trang để biết thêm thông tin về cách sử dụng và dự án demo.

14

Tôi gặp vấn đề tương tự. Tôi chỉ cần mở rộng mặc định LinearLayout bằng phương thức setAdapter:

public class LinearListView extends LinearLayout 
{ 
    Adapter adapter; 
    Observer observer = new Observer(this); 

    public LinearListView(Context context) 
    { 
     super(context); 
    } 

    public LinearListView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public LinearListView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    public void setAdapter(Adapter adapter) 
    { 
     if (this.adapter != null) 
      this.adapter.unregisterDataSetObserver(observer); 

     this.adapter = adapter; 
     adapter.registerDataSetObserver(observer); 
     observer.onChanged(); 
    } 

    private class Observer extends DataSetObserver 
    { 
     LinearListView context; 

     public Observer(LinearListView context) 
     { 
      this.context = context; 
     } 

     @Override 
     public void onChanged() 
     { 
      List<View> oldViews = new ArrayList<View>(context.getChildCount()); 

      for (int i = 0; i < context.getChildCount(); i++) 
       oldViews.add(context.getChildAt(i)); 

      Iterator<View> iter = oldViews.iterator(); 

      context.removeAllViews(); 

      for (int i = 0; i < context.adapter.getCount(); i++) 
      { 
       View convertView = iter.hasNext() ? iter.next() : null; 
       context.addView(context.adapter.getView(i, convertView, context)); 
      } 
      super.onChanged(); 
     } 

     @Override 
     public void onInvalidated() 
     { 
      context.removeAllViews(); 
      super.onInvalidated(); 
     } 
    } 
} 

Hy vọng điều này sẽ hữu ích!

+1

Đây là một ý tưởng tồi nếu bạn có nhiều mục trong "LinearListView" này do việc sử dụng lại hàng. – PaNaVTEC

+0

@PaNaVTEC: Có gì xấu về việc sử dụng lại hàng? Nó cũng phụ thuộc vào adapter nếu convertView đang được sử dụng hay không, vì vậy cái gì? – Nappy

+1

LinearListView của bạn không sử dụng lại hàng, đó là vấn đề. ListView sẽ chỉ hiển thị các hàng có thể nhìn thấy và khi bạn cuộn sẽ sử dụng lại các hàng, thì bạn có trong bộ nhớ chỉ các hàng hiển thị. Với LinearlistView của bạn, bạn có trong bộ nhớ tất cả các hàng bạn đã cư trú trong bộ điều hợp.Ngoài ra tôi nghĩ là một giải pháp tốt cho một bộ hàng nhỏ – PaNaVTEC

3

Tôi không có đủ điểm danh tiếng bình luận nhưng đối với những chỉ có 1 mục xuất hiện trong dung dịch Nappy chắc chắn bạn đã thiết lập sau trong file layout của bạn:

android:orientation="vertical" 

khác nó sẽ xuất hiện mà chỉ có một mục là được thêm vào nhưng trên thực tế chúng chỉ được thêm vào theo chiều ngang ... hy vọng điều này sẽ giúp ai đó.