Android - Tự động thêm lượt xem vào chế độ xem


148

Tôi có một bố cục để xem -

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_header"
        style="@style/Home.ListHeader" />

    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_none"
        android:visibility="gone"
        style="@style/TextBlock"
        android:paddingLeft="6px" />

    <ListView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_list" />


</LinearLayout>

Những gì tôi muốn làm, là trong hoạt động chính của tôi với một bố cục như thế này

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:id="@+id/item_wrapper">
</LinearLayout>

Tôi muốn lặp qua mô hình dữ liệu của mình và đưa nhiều khung nhìn bao gồm bố cục đầu tiên vào bố cục chính. Tôi biết tôi có thể làm điều này bằng cách xây dựng các điều khiển hoàn toàn trong mã, nhưng tôi tự hỏi liệu có cách nào để tự động xây dựng các khung nhìn để tôi có thể tiếp tục sử dụng bố cục thay vì đặt mọi thứ vào mã.


Bạn có thể kiểm tra câu trả lời cho stackoverflow.com/questions/3995215/ từ
Hãy cho tôi biết

Câu trả lời:


230

Sử dụng LayoutInflaterđể tạo chế độ xem dựa trên mẫu bố cục của bạn, sau đó đưa nó vào chế độ xem nơi bạn cần.

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);

// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");

// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

Bạn có thể phải điều chỉnh chỉ mục nơi bạn muốn chèn chế độ xem.

Ngoài ra, hãy đặt LayoutParams theo cách bạn muốn nó phù hợp với chế độ xem chính. ví dụ với FILL_PARENT, hoặc MATCH_PARENT, v.v.


2
đó là nơi bạn muốn đặt bố cục được tạo động trong chế độ xem chính của mình. đó là bit bạn phải điền từ mã của riêng bạn.
Mark Fisher

Đối với những người muốn dùng thử ngay bây giờ - bộ lọc bố cục thu được như hiển thị trong dòng đầu tiên vẫn giải quyết nhưng dường như không hoạt động, thay vào đó hãy sử dụnggetLayoutInflater()
Brendan

2
Sử dụng LayoutInflater vi = getLayoutInflater();từ một hoạt động để duy trì chủ đề hoạt động mà bạn không nhận được bằng cách khác.
akarthik10

1
@MrG Bạn nên đưa ra một câu hỏi riêng về SO. Câu hỏi này là về cách tạo động các khung nhìn, không phải về các đoạn.
Đánh dấu

2
@Arsh Nếu bạn có một câu hỏi mới và một vấn đề cụ thể, hãy nêu một câu hỏi SO riêng biệt nêu chi tiết mã bạn đã thử không hoạt động thay vì bình luận ở đây.
Mark Fisher

36

Xem LayoutInflaterlớp.

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup parent = (ViewGroup)findViewById(R.id.where_you_want_to_insert);
inflater.inflate(R.layout.the_child_view, parent);

làm cách nào để thêm onClicklistener vào các chế độ xem cá nhân bị thổi phồng
Vui lòng

20

Nó trông giống như những gì bạn thực sự muốn một ListView với bộ điều hợp tùy chỉnh để tăng bố cục được chỉ định. Sử dụng một ArrayAd CHƯƠNG và phương thức notifyDataSetChanged()bạn có toàn quyền kiểm soát việc tạo và hiển thị Lượt xem.

Hãy xem những hướng dẫn này


14

Để làm cho câu trả lời của @Mark Fisher rõ ràng hơn, chế độ xem được chèn bị thổi phồng phải là tệp xml trong thư mục bố cục nhưng không có bố cục (Viewgroup) như linearLayout, v.v. Ví dụ của tôi:

res / layout / my_view.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/i_am_id"
    android:text="my name"
    android:textSize="17sp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

Sau đó, điểm chèn phải là một bố cục như linearLayout:

res / layout / Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/aaa"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/insert_point"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </LinearLayout>

</RelativeLayout>

Sau đó, mã phải là

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shopping_cart);

    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.my_view, null);
    ViewGroup main = (ViewGroup) findViewById(R.id.insert_point);
    main.addView(view, 0);
}

Lý do tôi đăng câu trả lời tương tự này là khi tôi cố gắng thực hiện giải pháp của Mark, tôi đã bị kẹt với tập tin xml nào tôi nên sử dụng cho insert_point và chế độ xem con. Tôi đã sử dụng bố cục trong chế độ xem trẻ trước tiên và nó hoàn toàn không hoạt động, điều này khiến tôi mất vài giờ để tìm ra. Vì vậy, hy vọng khám phá của tôi có thể tiết kiệm thời gian của người khác.


@York Yang làm cách nào tôi có thể thêm Id của vies vào đây nếu chúng tôi thêm nhiều lượt xem bằng vòng lặp.
Rahul Kushwaha

5
// Parent layout
LinearLayout parentLayout = (LinearLayout)findViewById(R.id.layout);

// Layout inflater
LayoutInflater layoutInflater = getLayoutInflater();
View view;

for (int i = 1; i < 101; i++){
    // Add the text layout to the parent layout
    view = layoutInflater.inflate(R.layout.text_layout, parentLayout, false);

    // In order to get the view we have to use the new view with text_layout in it
    TextView textView = (TextView)view.findViewById(R.id.text);
    textView.setText("Row " + i);

    // Add the text view to the parent layout
    parentLayout.addView(textView);
}

1
Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
yivi

Làm cách nào tôi có thể nhận được ID của các chế độ xem khác nhau được tạo bằng For Loop.
Rahul Kushwaha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.