Listview页脚不显示

时间:2013-01-28 10:33:29

标签: android android-listview android-fragments

我创建了一个带延迟加载的动态列表视图。我试图向列表视图显示一个页脚,以便当用户滚动到列表视图的底部时,它将显示“加载更多项目”(作为页脚)并且它将加载更多项目。我已经实现了延迟加载。我已经设置了页脚,但它没有显示在列表视图中。请帮帮我。

包含listview的Tabfragment类:

package com.example.abe;

import java.util.ArrayList;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class Tab1Fragment extends ListFragment {
    ListView lv;
    Activity act = this.getActivity();
    Context ct = this.getActivity();
    XMLGettersSetters data;
    boolean loadingMore = false;
    String abc[] = new String[50];
    static int count = 0;
    final int itemsPerPage = 10;
    static ArrayList<String> myListItems = new ArrayList<String>();
    ArrayList<String> myListItems2;
    ArrayAdapter<String> adapter;
    ArrayAdapter<String> adapter1;

    static int size = 0;
    int position = 0;
    int top = 0;
    static String android_array1[];
    ArrayList<String> myListItems3;

    TabsFragmentActivity t = new TabsFragmentActivity();
    String parsed[] = new String[MainActivity.Sarray1.length];

    @SuppressWarnings("unused")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        adapter = new ArrayAdapter<String>(getActivity().getBaseContext(),
                android.R.layout.simple_list_item_1, t.myarray);
        ;
        View root = inflater.inflate(R.layout.tab_frag1_layout, container,
                false);
        lv = (ListView) root.findViewById(android.R.id.list);
        lv.setAdapter(adapter);
        getActivity().setTitle("ABE ST count: " + t.stcount + " items");
        parsed = MainActivity.Sarray1;
        for (int j = 0; j < parsed.length; j++) {
            System.out.println("sax" + parsed[j].toString());
        }

        return root;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        View footerView = ((LayoutInflater) this.getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.listfooter, null, false);
        lv.addFooterView(footerView);

        getListView().setOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                System.out.println(abc.length);
                System.out.println(count);
                System.out.println("First" + firstVisibleItem);
                System.out.println("Vis" + visibleItemCount);
                position = firstVisibleItem;
                View v = lv.getChildAt(0);
                top = (v == null) ? 0 : v.getTop();
                int lastInScreen = firstVisibleItem + visibleItemCount;
                System.out.println("Last" + lastInScreen);
                System.out.println("Total" + totalItemCount);
                if ((lastInScreen == totalItemCount) && !(loadingMore)) {
                    if (count < size) {
                        try {
                            Thread thread = new Thread(null, loadMoreListItems);
                            thread.start();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }

                    else if (count != 0) {
                        Toast.makeText(getActivity().getApplicationContext(),
                                "Complete Data", Toast.LENGTH_LONG).show();
                        int lvcnt = lv.getCount();
                        System.out.println("Adapter Count " + " " + lvcnt);
                        System.out.println("Abe adapter count" + " "
                                + adapter.getCount());
                    }
                }
            }
        });
        if (t.check1 == 0) {
            try {
                Thread thread = new Thread(null, loadMoreListItems);
                thread.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private Runnable loadMoreListItems = new Runnable() {
        @Override
        public void run() {
            loadingMore = true;
            t.myarray1 = new ArrayList<String>();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            size = parsed.length;
            for (int i = 0; i < itemsPerPage; i++) {
                if (count < size) {
                    t.myarray1.add(parsed[count].toString());

                    count = count + 1;
                    System.out.println("Count in run " + " " + count);
                } else {
                    break;
                }
            }
            Log.i("a", "b");
            try {
                getActivity().runOnUiThread(returnRes);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Log.i("a", "b");
        }
    };
    private Runnable returnRes = new Runnable() {
        @Override
        public void run() {
            if (t.myarray1 != null && t.myarray1.size() > 0) {
                for (int j = 0; j < t.myarray1.size(); j++) {
                    adapter.add(t.myarray1.get(j));

                    // adapter1.add(myListItems3.get(j));

                }
            }
            // setListAdapter(adapter);
            Log.i("a", "b");
            adapter.notifyDataSetChanged();
            // lv.setSelection(position);
            lv.setSelectionFromTop(position, top);
            Log.i("a", "b");
            getActivity().setTitle(
                    "ABE ST count: " + String.valueOf(adapter.getCount())
                            + " items");
            t.stcount = adapter.getCount();
            loadingMore = false;
            t.check1 = 1;

        }
    };
}

Listfooter xml(使用int tabfragment类):页脚的XML:

<?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:id="@+id/footer_1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="5dip"
    android:text="Loading"
    android:textSize="14sp"
    android:textStyle="bold" />

</LinearLayout>
</LinearLayout> 

2 个答案:

答案 0 :(得分:64)

实际上,在设置Adapter之前,你必须将FooterView添加到List .. Like Below ..

View root = inflater.inflate(R.layout.tab_frag1_layout, container,
                false);
lv = (ListView) root.findViewById(android.R.id.list);
View footerView = ((LayoutInflater) this.getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.listfooter, null, false);
lv.addFooterView(footerView);
lv.setAdapter(adapter);

答案 1 :(得分:12)

除了接受的答案之外,我想指出一些Android版本希望在设置适配器之前添加页脚,而某些版本似乎并不重要。

我在自己的应用程序中看到,在版本4.4.4上,您调用addFooterView和版本4.2.2的顺序并不重要,页脚赢了显示,除非您在 addFooterView之前致电setAdapter 。在调用setAdapter之前应始终添加标题,但添加页脚似乎不那么严格,但知道不同版本需要不同的设置很有用。因此,最好在调用setAdapter之前设置标头,以避免任何奇怪的行为。