Подтвердить что ты не робот

Недопустимый нижний колонтитул Listview

Я создал динамический список с ленивой загрузкой. Я пытаюсь показать нижний колонтитул в списке, так что, когда пользователь прокручивается в нижней части списка, он покажет "загрузка большего количества элементов" (как нижний колонтитул), и он загрузит больше элементов. Я реализовал ленивую загрузку. Я установил нижний колонтитул, но он не отображается в списке. Пожалуйста, помогите мне.

Класс Tabfragment, содержащий listview:

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

Ответ 1

На самом деле вам нужно добавить FooterView в List перед настройкой адаптера. Как ниже...

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

Ответ 2

В дополнение к принятому ответу я хотел бы указать, что некоторые версии Android хотят, чтобы нижний колонтитул был добавлен до того, как адаптер установлен, а какая-то версия, похоже, не имеет значения.

В моих собственных приложениях я видел, что в версии 4.4.4 не имеет значения, в каком порядке вы вызываете addFooterView, а в версии 4.2.2 нижний колонтитул не будет отображаться, если вы не назовете addFooterView до setAdapter. Добавление заголовка должно всегда происходить до вызова setAdapter, но добавление нижнего колонтитула кажется менее строгим, но полезно знать, что разные версии требуют другой настройки. Поэтому лучше всего настроить заголовки перед вызовом setAdapter, чтобы избежать какого-либо странного поведения.