I have created a dynamic listview with lazy loading. I am trying to show a footer to the listview, so that when the user scrolls to the bottom of the listview, it will show "loading more items" (as a footer)and it will load more item.I have implemented lazy loading. I have set the the footer, but it is not getting displayed on the listview. Please help me out.
Tabfragment class containing 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(Used int tabfragment class): XML for the footer:
<?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>
Actually, you have to add FooterView to List before setting Adapter.. 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);
In addition to the accepted answer I wanted to point out that some Android versions want the footer to be added before the adapter is set and some version it doesn't seem to matter.
I have seen in my own applications that on version 4.4.4
it doesn't matter in which order you call addFooterView
and on version 4.2.2
the footer won't show unless you call addFooterView
before setAdapter
. Adding a header should always happen before calling setAdapter
but adding a footer seems to be less strict but it's useful to know that different versions require a different setup. So it's best just to set the headers before calling setAdapter
to avoid any weird behavior.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With