ListView 从 SQLite 延迟加载(table 从 API JSON 填充)
ListView lazy loading from SQLite(table fill from API JSON)
我想要的:
我有 ListView。
动态加载数据到 ListView(当用户滚动 listView 时)。数据来自 SQLite table。
但是当 SQLite table 结束时 - 从 GitHub API 以 JSON 格式获取新数据。
然后将此数据保存到 SQLite table,然后在 lisview 中显示新项目。
我该怎么做?在此先感谢!
您的自定义 ListView class。
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.AbsListView;
/**
* Created by ozgur on 11/3/15 at 4:48 PM.
*/
public class ListView extends android.widget.ListView implements AbsListView.OnScrollListener {
private boolean inEndOfList = false;
private ListViewListener listViewListener;
public ListView(Context context) {
super(context);
init(context);
}
public ListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
//Log("onScrollStateChanged(..), scrollState =" + scrollState);
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int tot = firstVisibleItem + visibleItemCount;
if(tot >= totalItemCount) {
if(!inEndOfList) {
Log("onScroll, end of list");
inEndOfList = true;
if(listViewListener != null)
listViewListener.onEndOfList();
}
} else
inEndOfList = false;
}
private void init(Context context) {
this.setOnScrollListener(this);
}
private void Log(String str) {
Log.d("ListView", str);
}
public void setListViewListener(ListViewListener listViewListener) {
this.listViewListener = listViewListener;
}
public static interface ListViewListener {
public void onEndOfList() ;
}
}
在您的 activity 中,实施 ListView.ListViewListener
private ArrayList<Object> listObjects = new ArrayList<>();
int limit = 20;
int offset = 0;
private ListView customListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_your);
initYourViews();
customListView.setListViewListener(this);
}
@Override
public void onEndOfList() {
this.offset += 10 + limit;
this.initData();
}
private void initData() {
new AsyncTask<Void, Void, ArrayList<Object> /* or whatever */>() {
@Override
protected ArrayList<Object> doInBackground(Void... voids) {
ArrayList<Object> temp = YourSqLiteController.getData(limit, offset);
if(temp.size == 0 /* assume db data consumed, get from REST API*/) {
temp = YourApi.getData();
}
}
@Override
protected void onPostExecute(ArrayList<Object> temp){
if(temp != null && temp.size() > 0)
listObjects.addAll(temp);
update();
}
}.execute();
}
private void update(){
this.listAdapter.notifyDataSetChanged(); /* your adapter */
}
我想要的:
我有 ListView。
动态加载数据到 ListView(当用户滚动 listView 时)。数据来自 SQLite table。
但是当 SQLite table 结束时 - 从 GitHub API 以 JSON 格式获取新数据。
然后将此数据保存到 SQLite table,然后在 lisview 中显示新项目。
我该怎么做?在此先感谢!
您的自定义 ListView class。
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.AbsListView;
/**
* Created by ozgur on 11/3/15 at 4:48 PM.
*/
public class ListView extends android.widget.ListView implements AbsListView.OnScrollListener {
private boolean inEndOfList = false;
private ListViewListener listViewListener;
public ListView(Context context) {
super(context);
init(context);
}
public ListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
//Log("onScrollStateChanged(..), scrollState =" + scrollState);
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int tot = firstVisibleItem + visibleItemCount;
if(tot >= totalItemCount) {
if(!inEndOfList) {
Log("onScroll, end of list");
inEndOfList = true;
if(listViewListener != null)
listViewListener.onEndOfList();
}
} else
inEndOfList = false;
}
private void init(Context context) {
this.setOnScrollListener(this);
}
private void Log(String str) {
Log.d("ListView", str);
}
public void setListViewListener(ListViewListener listViewListener) {
this.listViewListener = listViewListener;
}
public static interface ListViewListener {
public void onEndOfList() ;
}
}
在您的 activity 中,实施 ListView.ListViewListener
private ArrayList<Object> listObjects = new ArrayList<>();
int limit = 20;
int offset = 0;
private ListView customListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_your);
initYourViews();
customListView.setListViewListener(this);
}
@Override
public void onEndOfList() {
this.offset += 10 + limit;
this.initData();
}
private void initData() {
new AsyncTask<Void, Void, ArrayList<Object> /* or whatever */>() {
@Override
protected ArrayList<Object> doInBackground(Void... voids) {
ArrayList<Object> temp = YourSqLiteController.getData(limit, offset);
if(temp.size == 0 /* assume db data consumed, get from REST API*/) {
temp = YourApi.getData();
}
}
@Override
protected void onPostExecute(ArrayList<Object> temp){
if(temp != null && temp.size() > 0)
listObjects.addAll(temp);
update();
}
}.execute();
}
private void update(){
this.listAdapter.notifyDataSetChanged(); /* your adapter */
}