use Endless Scrolling ListView. Here is the link. I have implemented it. if you have any query u can ask.
here is my TabActivity
import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
public class MainActivity extends TabActivity {
Context context = MainActivity.this;
TabHost tabHost;
TabSpec spec;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabHost = getTabHost();
// Android tab
tabHost.addTab(tabHost
.newTabSpec("Home")
.setIndicator("Home",
getResources().getDrawable(R.drawable.home))
.setContent(
new Intent(this, MyActivityGroup.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
tabHost.addTab(tabHost
.newTabSpec("Now Reading")
.setIndicator("Now Reading",
getResources().getDrawable(R.drawable.now_reading))
.setContent(
new Intent(this, NowReadingActivityGroup.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
tabHost.addTab(tabHost
.newTabSpec("Favorites")
.setIndicator("Favorites",
getResources().getDrawable(R.drawable.favorites))
.setContent(
new Intent(this, FavoriteActivityGroup.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
tabHost.addTab(tabHost
.newTabSpec("Profile")
.setIndicator("Profile",
getResources().getDrawable(R.drawable.profile))
.setContent(
new Intent(this, ProfileActivityGroup.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
tabHost.setCurrentTabByTag("Home");
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
here is the ActivityGroup class
import java.util.Stack;
import android.app.Activity;
import android.app.ActivityGroup;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.view.Window;
public class MyActivityGroup extends ActivityGroup {
private Stack<String> stack;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (stack == null) {
stack = new Stack<String>();
}
push("1stStackActivity", new Intent(this, Home.class));
}
@Override
public void finishFromChild(Activity child) {
pop();
}
@Override
public void onBackPressed() {
pop();
}
public void push(String id, Intent intent) {
Window window = getLocalActivityManager().startActivity(id,
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
if (window != null) {
stack.push(id);
setContentView(window.getDecorView());
}
}
public void pop() {
if (stack.size() == 1) {
Home.BookTitle = null;
Home.BookCoverPhotos = null;
Home.BookAuther = null;
Home.BookPublishDate = null;
Home.language = "all";
Home.bitmapArray = null;
Home.BookIDs = null;
Home.BookRating = null;
Home.BookDescription = null;
Home.BookCode = null;
Home.userFName = null;
Home.gridViewState = null;
Home.initialIndex = 0;
Home.CustomerID = -1;
Home.checkBookCount = true;
Home.str = null;
Home.FlagSharedPreferences = false;
BookSearchResultActivity.BookTitle = null;
BookSearchResultActivity.BookCoverPhotos = null;
BookSearchResultActivity.BookAuther = null;
BookSearchResultActivity.BookPublishDate = null;
BookSearchResultActivity.ImageByte = null;
BookSearchResultActivity.bitmapArray = null;
BookSearchResultActivity.BookIDs = null;
BookSearchResultActivity.BookRating = null;
BookSearchResultActivity.BookDescription = null;
BookSearchResultActivity.startIndex = 0;
BookSearchResultActivity.endIndex = 14;
BookSearchResultActivity.listViewState = null;
finish();
}
LocalActivityManager manager = getLocalActivityManager();
manager.destroyActivity(stack.pop(), true);
if (stack.size() > 0) {
Intent lastIntent = manager.getActivity(stack.peek()).getIntent()
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Window newWindow = manager.startActivity(stack.peek(), lastIntent);
setContentView(newWindow.getDecorView());
}
}
}
and here is my Home Activty Class which uses the EndlessLisnter for gridview but you can use this for listview also.
public class Home extends Activity {
/** Called when the activity is first created. */
static final String URL = "http://www.shiaislamiclibrary.com/requesthandler.ashx";
static final String KEY_ITEM = "Book"; // parent node
static final String KEY_BOOKAUTHOR = "book_author";
static final String KEY_BOOKRATING = "BookRating";
static final String KEY_BOOKID = "BookID";
static final String KEY_BOOKDESC = "BookDescription";
static final String KEY_BOOKDATEPUBLISHED = "DatePublished";
static final String KEY_BOOKTITLE = "BookTitle";
static final String KEY_BOOKCODE = "BookCode";
static final String KEY_BOOKIMAGE = "BookImage";
static ArrayList<String> BookTitle = null;
static ArrayList<Integer> BookRating = null;
static ArrayList<String> BookDescription = null;
static ArrayList<String> BookCoverPhotos = null;
static ArrayList<String> BookAuther = null;
static ArrayList<String> BookIDs = null;
static ArrayList<String> BookCode = null;
static ArrayList<String> BookPageCount = null;
static ArrayList<String> BookPublishDate = null;
static ArrayList<Bitmap> bitmapArray = null;
static String str = null;
Context ctx = this;
Activity act = this;
Context context = Home.this;
URL bookImageURL = null;
Bitmap bitMapImage = null;
LayoutInflater inflater = null;
GridView gridView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.home_activity);
View viewToLoad = LayoutInflater.from(this.getParent()).inflate(
R.layout.home_activity, null);
this.setContentView(viewToLoad);
imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
gridView = (GridView) findViewById(R.id.gridview);
gridView.setOnScrollListener(new EndlessScrollListener());
if (gridViewState != null) {
gridView.onRestoreInstanceState(gridViewState);
}
public void checkConnection() {
// Check Flight mode ON/OFF
if (Settings.System.getInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 0) {
if (cm.getActiveNetworkInfo() != null
&& cm.getActiveNetworkInfo().isAvailable()
&& cm.getActiveNetworkInfo().isConnected()) {
// Avoid to reload the page again and again
if (str == null) {
str = "TempString";
BookTitle = new ArrayList<String>();
BookRating = new ArrayList<Integer>();
BookDescription = new ArrayList<String>();
BookIDs = new ArrayList<String>();
BookCode = new ArrayList<String>();
BookCoverPhotos = new ArrayList<String>();
BookAuther = new ArrayList<String>();
BookPublishDate = new ArrayList<String>();
BookPageCount = new ArrayList<String>();
bitmapArray = new ArrayList<Bitmap>();
new UIThread().execute(URL, initialIndex + "");
} else {
ImageAdapter adapter = new ImageAdapter(context, act);
gridView.setAdapter(adapter);
if (gridViewState != null) {
gridView.onRestoreInstanceState(gridViewState);
}
btnLanguage.setText(language);
}
} else {
connectionFailureDialog("CONNECTION FAILURE...!",
"No internet connection found");
}
} else {
new DialogClass(getParent()).airplaneDialog("AIRPLANE MODE...!",
"Please make sure Airplane mode is Turned Off", "Exit");
}
}
@Override
protected void onStart() {
checkConnection();
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
long arg3) {
Intent bookOverViewIntent = new Intent();
bookOverViewIntent.setClass(getParent(), BookOverView.class);
bookOverViewIntent.putExtra("BITMAP", bitmapArray.get(pos));
bookOverViewIntent.putExtra("BOOK_TITLE", BookTitle.get(pos));
bookOverViewIntent.putExtra("BOOK_AUTHOR", BookAuther.get(pos));
bookOverViewIntent.putExtra("BOOK_PUBLISH_DATE",
BookPublishDate.get(pos));
bookOverViewIntent.putExtra("BOOK_ID", BookIDs.get(pos));
bookOverViewIntent.putExtra("BOOK_RATING", BookRating.get(pos));
bookOverViewIntent.putExtra("BOOK_DESC",
BookDescription.get(pos));
bookOverViewIntent.putExtra("PAGE_NO", "1");
bookOverViewIntent.putExtra("BOOK_CODE", BookCode.get(pos));
bookOverViewIntent.putExtra("BOOK_PAGE_COUNT",
BookPageCount.get(pos));
bookOverViewIntent.putExtra("ACTIVITY", "Home");
MyActivityGroup activityStack = (MyActivityGroup) getParent();
activityStack.push("BookOverView", bookOverViewIntent);
gridViewState = gridView.onSaveInstanceState();
}
});
private class listAdapter extends BaseAdapter {
int size;
@Override
public int getCount() {
if (btnFlag.equals("btnLanguage")) {
size = getResources().getStringArray(
R.array.spnr_language_array).length;
} else if (btnFlag.equals("btnBrowseBy")) {
size = getResources().getStringArray(R.array.spnr_browse_array).length;
}
return size;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = null;
LayoutInflater inflater;
if (btnFlag.equals("btnLanguage")) {
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.itemslist, parent, false);
TextView listText = (TextView) row.findViewById(R.id.textView2);
listText.setText(getResources().getStringArray(
R.array.spnr_language_array)[position]);
} else if (btnFlag.equals("btnBrowseBy")) {
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.itemslist, parent, false);
TextView listText = (TextView) row.findViewById(R.id.textView2);
listText.setText(getResources().getStringArray(
R.array.spnr_browse_array)[position]);
}
return row;
}
}
private class EndlessScrollListener implements OnScrollListener {
private int visibleThreshold = 0;
private int currentPage = 0;
private int previousTotal = 0;
private boolean loading = true;
public EndlessScrollListener() {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
currentPage++;
}
}
if (!loading
&& (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
if (checkBookCount) {
new UIThread().execute(URL, initialIndex + "");
Log.i("Reached If", "End");
}
loading = true;
gridViewState = gridView.onSaveInstanceState();
}
}
private class UIThread extends AsyncTask<String, Integer, String> {
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(getParent(),
"Acumlating Books from server...",
"This may Take a few seconds.\nPlease Wait...");
}
@Override
protected String doInBackground(String... params) {
String URL = params[0];
int lIndex = Integer.valueOf(params[1]);
XMLParser parser = new XMLParser();
String XMLString = null;
XMLString = parser.getXmlFromUrl_FeaturedBooks(URL, lIndex,
language);
// Log.i("language = ", language);
// Log.i("XMLString = ", XMLString);
if (XMLString != null) {
initialIndex = lIndex + 14;
Document doc = parser.getDomElement(XMLString);
NodeList nlBooksLimit = doc
.getElementsByTagName(KEY_ITEM_BOOKs_LIMIT);
Element eLimit = (Element) nlBooksLimit.item(0);
totalBookCount = 0;
try {
totalBookCount = Integer.valueOf(parser.getValue(eLimit,
KEY_ITEM_TOTAL_BOOKS));
checkBookCount = true;
} catch (NumberFormatException e) {
checkBookCount = false;
totalBookCount = totalBookCount + 0;
}
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
Bitmap imageNotFound = BitmapFactory.decodeResource(
getResources(), R.drawable.defaultcoverphoto);
for (int i = 0; i < nl.getLength(); i++) {
Element e = (Element) nl.item(i);
try {
BookRating.add(Integer.valueOf(parser.getValue(e,
KEY_BOOKRATING)));
} catch (Exception e2) {
BookRating.add(0);
}
BookDescription.add(parser.getValue(e, KEY_BOOKDESC));
BookTitle.add(parser.getValue(e, KEY_BOOKTITLE));
BookCoverPhotos
.add("http://shiaislamicbooks.com/books_Snaps/"
+ parser.getValue(e, KEY_BOOKCODE)
+ "/1_thumb.jpg");
int tempCount = BookCoverPhotos.size() - 1;
BookAuther.add(parser.getValue(e, KEY_BOOKAUTHOR));
BookPublishDate.add(parser.getValue(e,
KEY_BOOKDATEPUBLISHED));
BookIDs.add(parser.getValue(e, KEY_BOOKID));
BookCode.add(parser.getValue(e, KEY_BOOKCODE));
BookPageCount.add(parser.getValue(e, KEY_PAGE_COUNT));
try {
bookImageURL = new URL(BookCoverPhotos.get(tempCount));
} catch (MalformedURLException e1) {
// e1.printStackTrace();
}
try {
bitMapImage = BitmapFactory.decodeStream(bookImageURL
.openConnection().getInputStream());
bitmapArray.add(bitMapImage);
} catch (IOException e2) {
// e2.printStackTrace();
bitmapArray.add(imageNotFound);
}
publishProgress(i + 1);
}
} else {
publishProgress(5000);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setMessage(values[0]
+ " Book(s) found \nPlease wait...");
if (values[0] == 5000) {
Toast.makeText(context,
"Rrequest Time out!\nNo or Slow Internet Connection!",
Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progressDialog.dismiss();
ImageAdapter adapter = new ImageAdapter(context, act);
gridView.setAdapter(adapter);
if (gridViewState != null) {
gridView.onRestoreInstanceState(gridViewState);
}
}
}
class ViewHolder {
TextView txt_BooksTitle;
ImageView img_BookCoverPhoto;
}
}
here you can note that first i m filling my gridview from the Asynctask and then I have set my gridview as endless listner as
gridView.setOnScrollListener(new EndlessScrollListener());
next time i m calling the asynctask from the Endless listner class.
new UIThread().execute(URL, initialIndex + "");
you have to do your all task from there. where i have call this above line in the endless listner.