จะเพิ่มส่วนท้ายใน ListView ได้อย่างไร?


88

ฉันกำลังพัฒนาแอปพลิเคชันในแอปพลิเคชันของฉันฉันใช้ Listview เพื่อแสดงข้อมูลโดยใช้การแยกวิเคราะห์ dom ฉันต้องการส่วนท้ายใน listview เมื่อฉันคลิกส่วนท้ายข้อมูลเพิ่มเติมเพิ่มเติมที่เพิ่มในมุมมองรายการฉันแนบรูปภาพฉันต้องการการออกแบบนั้นและ กระบวนการโปรดดู image1 และ imgae2 ฉันพูดถึงส่วนท้ายในรูปสี่เหลี่ยมผืนผ้าสีแดง

รูปที่ 1 - ส่วนท้ายเช่น "ข่าวเพิ่มเติม"
ข้อความแสดงแทน

ข้อความแสดงแทน

มะเดื่อ 2- เพิ่มบันทึกเพิ่มเติม 10 รายการที่เพิ่มในมุมมองรายการ

คำตอบ:


206

สร้างเค้าโครงมุมมองส่วนท้ายที่ประกอบด้วยข้อความที่คุณต้องการตั้งค่าเป็นส่วนท้ายแล้วลอง

View footerView = ((LayoutInflater) ActivityContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_layout, null, false);
ListView.addFooterView(footerView);

เค้าโครงสำหรับส่วนท้ายอาจเป็นดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="7dip"
    android:paddingBottom="7dip"
    android:orientation="horizontal"
    android:gravity="center">

    <LinearLayout 
        android:id="@+id/footer_layout" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_gravity="center">

    <TextView 
        android:text="@string/footer_text_1" 
        android:id="@+id/footer_1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textSize="14dip" 
        android:textStyle="bold" 
        android:layout_marginRight="5dip" />
    </LinearLayout>
</LinearLayout> 

ชั้นกิจกรรมอาจเป็น:

public class MyListActivty extends ListActivity {
    private Context context = null;
    private ListView list = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        list = (ListView)findViewById(android.R.id.list);

        //code to set adapter to populate list
        View footerView =  ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_layout, null, false);
        list.addFooterView(footerView);
    }
}

7
นี่เป็นสิ่งที่ดี แต่ถ้าคุณต้องการให้ส่วนท้ายคงที่บนหน้าจอแทนที่จะมองเห็นได้เฉพาะเมื่อเลื่อนไปที่ด้านล่าง? และถ้าคุณต้องการให้ส่วนท้ายมองเห็นได้แม้ในขณะที่รายการนั้นว่างเปล่า? ดูคำถามเต็มรูปแบบในstackoverflow.com/questions/12353701/...
gcl1

33
ฉันมีปัญหาในการทำให้โค้ดนี้ใช้งานได้และแก้ไขได้ นี่คือสิ่งที่เอกสาร addFooterView () ระบุไว้NOTE: Call this before calling setAdapter. This is so ListView can wrap the supplied cursor with one that will also account for header and footer views.
demosten

13
@ gcl1 ในกรณีนั้นไม่ใช่ส่วนท้ายเป็นเพียงองค์ประกอบธรรมดาในเค้าโครงของคุณที่อยู่ด้านล่างมุมมองรายการ เพียงแค่คุณรู้ว่าวางไว้ด้านล่างมุมมองรายการ?
Davor

2
เพียงแค่พูดถึง @demonsten: หากคุณโทรหา setAdapter () ก่อนที่จะเพิ่มมุมมองคุณจะมีช่วงเวลาที่ไม่ดี
Ben Ogorek

1
หากไม่มีข้อมูลในอะแดปเตอร์แสดงว่าส่วนท้ายจะไม่แนบ (แสดง) แล้วเราจะแสดงส่วนท้ายได้อย่างไรแม้ว่าจะไม่มีข้อมูลในอะแดปเตอร์? ขอบคุณ
Kalpesh Lakhani

10

คำตอบที่นี่ค่อนข้างล้าสมัย แม้ว่ารหัสจะยังคงเหมือนเดิม แต่ก็มีการเปลี่ยนแปลงพฤติกรรมบางอย่าง

public class MyListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        TextView footerView = (TextView) ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_view, null, false);
        getListView().addFooterView(footerView);
        setListAdapter(new ArrayAdapter<String>(this, getResources().getStringArray(R.array.news)));
    }
}

ข้อมูลเกี่ยวกับaddFooterView()วิธีการ

เพิ่มมุมมองคงที่เพื่อให้ปรากฏที่ด้านล่างของรายการ หากaddFooterView()ถูกเรียกมากกว่าหนึ่งครั้งมุมมองจะปรากฏตามลำดับที่เพิ่ม มุมมองที่เพิ่มโดยใช้การโทรนี้สามารถโฟกัสได้หากต้องการ

คำตอบส่วนใหญ่ข้างต้นเน้นประเด็นสำคัญมาก -

addFooterView()จะต้องถูกเรียกก่อนที่จะเรียกsetAdapter()นี่คือสิ่งที่ ListView สามารถรวมเคอร์เซอร์ที่ให้มาด้วยเคอร์เซอร์ที่จะพิจารณามุมมองส่วนหัวและส่วนท้าย

จาก Kitkat สิ่งนี้เปลี่ยนไป

หมายเหตุ: เมื่อเปิดตัวครั้งแรกเมธอดนี้สามารถเรียกใช้ก่อนตั้งค่าอะแด็ปเตอร์ด้วย setAdapter (ListAdapter) เท่านั้น เริ่มต้นด้วย KITKAT วิธีนี้อาจเรียกได้ตลอดเวลา หากอะแด็ปเตอร์ของ ListView ไม่ขยาย HeaderViewListAdapter อะแดปเตอร์จะถูกรวมเข้ากับอินสแตนซ์ที่สนับสนุนของ WrapperListAdapter

เอกสารประกอบ


9

ฉันรู้ว่านี่เป็นคำถามเก่ามาก แต่ฉันไปที่นี่และพบว่าคำตอบนั้นไม่น่าพอใจ 100% เพราะตามที่ gcl1 กล่าวไว้ - วิธีนี้ทำให้ส่วนท้ายไม่ใช่ส่วนท้ายของหน้าจอ แต่เป็นเพียง "ส่วนเสริม "ไปยังรายการ

บรรทัดด้านล่าง - สำหรับคนอื่น ๆ ที่สามารถใช้ Google ได้ที่นี่ - ฉันพบคำแนะนำต่อไปนี้ที่นี่: ส่วนท้ายคงที่และมองเห็นได้เสมอด้านล่าง ListFragment

ลองทำดังนี้โดยเน้นที่ปุ่ม (หรือองค์ประกอบส่วนท้ายใด ๆ ) ที่แสดงรายการแรกใน XML จากนั้นรายการจะถูกเพิ่มเป็น "layout_above":

<RelativeLayout>

<Button android:id="@+id/footer" android:layout_alignParentBottom="true"/> 
<ListView android:id="@android:id/list" **android:layout_above**="@id/footer"> <!-- the list -->

</RelativeLayout>


2

กิจกรรมที่คุณต้องการเพิ่มส่วนท้าย listview และฉันยังสร้างเหตุการณ์ในการคลิกส่วนท้าย listview

  public class MainActivity extends Activity
{

        @Override
        protected void onCreate(Bundle savedInstanceState)
         {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            ListView  list_of_f = (ListView) findViewById(R.id.list_of_f);

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

            View view = inflater.inflate(R.layout.web_view, null);  // i have open a webview on the listview footer

            RelativeLayout  layoutFooter = (RelativeLayout) view.findViewById(R.id.layoutFooter);

            list_of_f.addFooterView(view);

        }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg" >

    <ImageView
        android:id="@+id/dept_nav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/dept_nav" />

    <ListView
        android:id="@+id/list_of_f"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/dept_nav"
        android:layout_margin="5dp"
        android:layout_marginTop="10dp"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:listSelector="@android:color/transparent" >
    </ListView>

</RelativeLayout>

0

ในคำถามนี้คำตอบที่ดีที่สุดไม่ได้ผลสำหรับฉัน หลังจากนั้นฉันพบวิธีนี้เพื่อแสดงส่วนท้าย listview

LayoutInflater inflater = getLayoutInflater();
ViewGroup footerView = (ViewGroup)inflater.inflate(R.layout.footer_layout,listView,false);
listView.addFooterView(footerView, null, false);

และสร้างเค้าโครงใหม่เรียก footer_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Done"
        android:textStyle="italic"
        android:background="#d6cf55"
        android:padding="10dp"/>
</LinearLayout>

ถ้าไม่ได้ทำงานดูบทความนี้ได้ยิน


0

คุณสามารถใช้ stackLayout ภายในเลย์เอาต์นี้คุณสามารถใส่กรอบรายการตัวอย่างเช่น:

<StackLayout VerticalOptions="FillAndExpand">
            <ListView  ItemsSource="{Binding YourList}"
                       CachingStrategy="RecycleElement"
                       HasUnevenRows="True">

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell >
                            <StackLayout  Orientation="Horizontal">
                                <Label Text="{Binding Image, Mode=TwoWay}" />

                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <Frame BackgroundColor="AliceBlue" HorizontalOptions="FillAndExpand">
                <Button Text="More"></Button>
            </Frame>
        </StackLayout>

นี่คือผลลัพธ์:

ป้อนคำอธิบายภาพที่นี่

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