Android - เพิ่มมุมมองลงในมุมมองแบบไดนามิก


148

ฉันมีเลย์เอาต์สำหรับการดู -

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

สิ่งที่ฉันอยากทำคืออยู่ในกิจกรรมหลักของฉันโดยมีเค้าโครงดังนี้

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

ฉันต้องการวนลูปผ่านโมเดลข้อมูลของฉันและแทรกมุมมองหลายมุมมองซึ่งประกอบด้วยเลย์เอาต์แรกในเลย์เอาต์หลัก ฉันรู้ว่าฉันสามารถทำได้โดยการสร้างส่วนควบคุมภายในรหัสอย่างสมบูรณ์ แต่ฉันสงสัยว่ามีวิธีสร้างมุมมองแบบไดนามิกหรือไม่เพื่อให้ฉันสามารถใช้เค้าโครงต่อไปแทนที่จะใส่ทุกอย่างในรหัส


คุณสามารถตรวจสอบคำตอบสำหรับstackoverflow.com/questions/3995215/
บอกฉันว่า

คำตอบ:


230

ใช้การLayoutInflaterเพื่อสร้างมุมมองตามเท็มเพลตเลย์เอาต์ของคุณจากนั้นแทรกลงในมุมมองที่คุณต้องการ

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

คุณอาจต้องปรับดัชนีที่คุณต้องการแทรกมุมมอง

นอกจากนี้ตั้งค่า LayoutParams ตามวิธีที่คุณต้องการให้พอดีกับมุมมองพาเรนต์ เช่นกับFILL_PARENT, หรือMATCH_PARENT, ฯลฯ


2
เป็นที่ที่คุณต้องการวางเค้าโครงที่สร้างขึ้นแบบไดนามิกในมุมมองหลักของคุณ นั่นคือบิตที่คุณต้องกรอกจากรหัสของคุณเอง
มาร์คฟิชเชอร์

สำหรับผู้ที่ต้องการลองใช้งานตอนนี้ - เลย์เอาต์เลย์เอาท์ที่ได้รับตามที่แสดงในบรรทัดแรกยังคงมีการแก้ไข แต่ดูเหมือนจะไม่ทำงานแทนที่จะใช้getLayoutInflater()
เบรนแดน

2
ใช้LayoutInflater vi = getLayoutInflater();จากกิจกรรมเพื่อรักษาธีมของกิจกรรมที่คุณไม่ได้รับ
akarthik10

1
@MrG คุณควรตั้งคำถามแยกต่างหากสำหรับ SO คำถามนี้เกี่ยวกับวิธีสร้างมุมมองแบบไดนามิกไม่ใช่เกี่ยวกับส่วนย่อย
Mark Fisher

2
@Arsh หากคุณมีคำถามใหม่และปัญหาเฉพาะให้เพิ่มคำถาม SO แยกต่างหากซึ่งให้รายละเอียดว่าคุณได้ลองใช้รหัสใดบ้างที่ไม่ทำงานแทนที่จะแสดงความคิดเห็นที่นี่
มาร์คฟิชเชอ

36

ดูLayoutInflaterชั้นเรียน

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

ฉันจะเพิ่ม onClicklistener ให้กับมุมมองบุคคลที่สูงเกินจริงได้อย่างไรโปรดระบุตัวอย่าง
Sagar Devanga

20

ดูเหมือนว่าสิ่งที่คุณต้องการ ListView ด้วยอะแดปเตอร์ที่กำหนดเองเพื่อขยายเค้าโครงที่ระบุ ใช้ArrayAdapterและวิธีการที่notifyDataSetChanged()คุณมีการควบคุมเต็มรูปแบบของการสร้างและการแสดงผลมุมมอง

ดูบทเรียนเหล่านี้


14

หากต้องการทำให้คำตอบของ @Mark Fisher ชัดเจนยิ่งขึ้นมุมมองที่แทรกไว้ที่ถูกขยายเกินควรจะเป็นไฟล์ xml ภายใต้โฟลเดอร์เลย์เอาต์ แต่ไม่มีเลย์เอาต์ (ViewGroup) เช่น LinearLayout เป็นต้นภายใน ตัวอย่างของฉัน:

ความละเอียด / รูปแบบ / 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"/>

จากนั้นจุดแทรกควรเป็นเลย์เอาต์เช่น LinearLayout:

ความละเอียด / รูปแบบ / 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>

จากนั้นรหัสควรเป็น

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

เหตุผลที่ฉันโพสต์คำตอบที่คล้ายกันนี้ก็คือเมื่อฉันพยายามใช้โซลูชันของ Mark ฉันติดอยู่กับไฟล์ xml ที่ฉันควรใช้สำหรับ insert_point และมุมมองลูก ฉันใช้เลย์เอาต์ในมุมมองของเด็กก่อนและมันก็ไม่ทำงานทั้งหมดซึ่งใช้เวลาหลายชั่วโมงกว่าจะคิดออก ดังนั้นหวังว่าการสำรวจของฉันจะช่วยประหยัดเวลาของผู้อื่นได้


@York Yang ฉันจะเพิ่ม Id's of vies ที่นี่ได้อย่างไรถ้าเราเพิ่มมากกว่าหนึ่งมุมมองที่ใช้สำหรับลูป
ราหุลคูชูฮา

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
ในขณะที่ข้อมูลโค้ดนี้อาจเป็นโซลูชันรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพการโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ
yivi

ฉันจะรับ ID ของมุมมองต่าง ๆ ที่สร้างโดยใช้ For Loop ได้อย่างไร
ราหุลคูชูฮา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.