gpt4 book ai didi

android - ListView 在滚动底部加载更多内容

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:12 25 4
gpt4 key购买 nike

在 MainActivity 中,我创建了 DownloadTask,它填充模型类,然后通过 CustomListAdapter 类填充 ListView ,但我创建了识别滚动结束的函数,我想将更多项目加载到 ListView 中。我正在阅读和查看互联网上的代码,但我无法解决这个问题,因为它有点不同。MainActivity 类

public void updateList() {
adap = new CustomListAdapter(this, feedList, null);

feedListView.setAdapter(adap);
feedListView.setOnScrollListener(new OnScrollListener() {

public void onScrollStateChanged(AbsListView view,
int scrollState) { // TODO Auto-generated method stub
int threshold = 1;
int count = feedListView.getCount();

if (scrollState == SCROLL_STATE_IDLE) {
if (feedListView.getLastVisiblePosition() >= count
- threshold) {
mHandler = new Handler();
mIsLoading = true;


Toast.makeText(getApplicationContext(), "END", Toast.LENGTH_LONG).show();
}
}
}

public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {


}

});


}


public class DownloadFilesTask extends AsyncTask<String, Integer, Void> {

@Override
protected void onProgressUpdate(Integer... values) {
}

@Override
protected void onPostExecute(Void result) {
if (null != feedList) {
updateList();
}

if (progressbar.isShown()) {
progressbar.setVisibility(View.INVISIBLE);
}

}

@Override
protected Void doInBackground(String... params) {
String url = params[0];

// getting JSON string from URL
JSONObject json = getJSONFromUrl(url);

//parsing json data
parseJson(json);
return null;
}}
public JSONObject getJSONFromUrl(String url) {
InputStream is = null;
JSONObject jObj = null;
String json = null;

// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}

// return JSON String
return jObj;

}

public void parseJson(JSONObject json) {
try {

// parsing json object
if (json.getString("status").equalsIgnoreCase("ok")) {
JSONArray posts = json.getJSONArray("posts");




feedList = new ArrayList<FeedItem>();

for (int i = 0; i < posts.length(); i++) {

JSONObject post = (JSONObject) posts.getJSONObject(i);
FeedItem item = new FeedItem();

/////.....
feedList.add(item);



}

}



} catch (JSONException e) {
e.printStackTrace();
}
}

自定义列表适配器

 public class CustomListAdapter extends BaseAdapter  
{



private int mCount = 25;
private ArrayList<FeedItem> listData;
private LayoutInflater layoutInflater;
private Context mContext;
private ArrayList<String> data;
protected ListView feedListView;

public CustomListAdapter( Context context, ArrayList<FeedItem> listData)
{


this.listData = listData;
layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mContext = context;

}

public void addMoreItems(int count) {
mCount += count;
notifyDataSetChanged();
}


@Override
public int getCount()
{
return mCount;
}

@Override
public Object getItem(int position)
{
return position;
}

@Override
public long getItemId(int position)
{
return position;
}


public View getView( int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
View row=convertView;
if ((row == null) || (row.getTag()==null)) {

convertView = layoutInflater.inflate(R.layout.list_row_layout, null);
holder = new ViewHolder();
////
convertView.setTag(holder);






}
else
{
holder = (ViewHolder) convertView.getTag();

}

final FeedItem newsItem = (FeedItem) listData.get(position);
/////



return convertView;
}


static class ViewHolder
{
////
}


}

当我到达底部时, toast 就创建好了。

最佳答案

不使用 OnScrollListener,您可以将位置与列表数据大小进行比较,并相应地在您的适配器类中加载更多项目。

public View getView( int position, View convertView, ViewGroup parent){
if(position == getCount()-1){
// load new items here. you can do a for loop here, if you'd like to add multiple items.
addMoreItems(newItem);
}

// rest of the getView implementation
}

并且您还需要更新以下方法:

public void addMoreItems(FeedItem newItem) {
listData.add(newItem); // since you want to add this item at the end of the list
notifyDataSetChanged();
}

@Override
public int getCount(){
return listData.size();
}

@Override
public Object getItem(int position){
return listData.get(position);
}

并且当您想要更新 listView 时,不要创建新的适配器,就像您在更新方法中所做的那样。如果你这样做,它会摆脱以前的内容。相反,只需调用适配器的 addMoreItems 方法,它就会为您解决问题。

关于android - ListView 在滚动底部加载更多内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com