我创建了一个带延迟加载的动态列表视图。我试图向列表视图显示一个页脚,以便当用户滚动到列表视图的底部时,它将显示“加载更多项目”(作为页脚)并且它将加载更多项目。我已经实现了延迟加载。我已经设置了页脚,但它没有显示在列表视图中。请帮帮我。
包含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>
答案 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
之前设置标头,以避免任何奇怪的行为。