无限滚动列表视图不起作用

编程入门 行业动态 更新时间:2024-10-28 00:26:40
本文介绍了无限滚动列表视图不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在开发一个应用程序.在我的应用程序中,我使用 listview 来显示来自 json 的数据.所有数据显示完美.但我想要的是,显示前 10 个对象,然后加载项目应该显示,然后剩余的 10 个将显示.我的 json 响应如下所示.

{兴趣":[{interestsent_user_id":369,"name":"abc","profile_id":"686317",图片":"",},{interestsent_user_id":369,"name":"def","profile_id":"686318",图片":"",},{interestsent_user_id":369,"name":"吉","profile_id":"686319",图片":"",},{interestsent_user_id":369,"name":"jkl","profile_id":"686320",图片":"",},{interestsent_user_id":369,"name":"mno","profile_id":"686321",图片":"",},{interestsent_user_id":369,"name":"pqr","profile_id":"686322",图片":"",},………………………………]}

Interestsent.java

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);INTEREST_SENT_URL = "fshdfh/webservice/interestsent?version=apps&user_login_id=00";new GetData().execute("");listview = (ListView) findViewById(R.id.listview);Log.i("DATA", "页面 ::onCreate onCreate onCreate ");mHandler = new Handler();listview.setOnScrollListener(new EndlessScrollListener() {@覆盖public void onLoadMore(int page, int totalItemsCount) {Log.i("DATA", "page :: " + page + " totalItemsCount :: "+ totalItemsCount);mProgressbar = new ProgressDialog(MainActivity.this);mProgressbar.setMessage("加载中...");mProgressbar.show();计数++;如果(计数< maindata.size()){如果(适配器!= null){如果 (!isLoadingMore) {isLoadingMore = true;mHandler.postDelayed(loadMoreRunnable, 1000);}}}}});}Runnable loadMoreRunnable = new Runnable() {@覆盖公共无效运行(){//TODO 自动生成的方法存根如果(计数< maindata.size()){如果(适配器!= null){适配器.addAll(maindata.get(count));mHandler.removeCallbacks(loadMoreRunnable);isLoadingMore = false;如果(mProgressbar.isShowing())mProgressbar.dismiss();}}}};静态 <T>ArrayList>chunkList(List list, final int L) {ArrayList>部分 = 新的 ArrayList>();最终 int N = list.size();for (int i = 0; i data = new ArrayList>();ServiceHandler sh = new ServiceHandler();/*尝试 {线程睡眠(5000);} catch (InterruptedException e) {//TODO 自动生成的 catch 块e.printStackTrace();}*//*for (int i = 0; i " + jsonStr);如果(jsonStr != null){尝试 {JSONObject jsonObj = new JSONObject(jsonStr);//获取JSON数组节点Interestent = jsonObj.getJSONArray(INTEREST_SENT);//遍历所有联系人for (int i = 0; i <interestent.length(); i++) {JSONObject c =interestsent.getJSONObject(i);//创建新的 HashMap//HashMapmap = new HashMap();HashMapmap = new HashMap();//将每个子节点添加到 HashMap key =>价值map.put(INTEREST_USER_ID, c.getString(INTEREST_USER_ID));map.put(INTEREST_SENT_NAME,c.getString(INTEREST_SENT_NAME));map.put(INTEREST_SENT_PROFILE, c.getString(INTEREST_SENT_PROFILE));map.put(INTEREST_SENT_IMAGE, c.getString(INTEREST_SENT_IMAGE));map.put(INTEREST_SENT_CAST, c.getString(INTEREST_SENT_CAST));map.put(INTEREST_SENT_AGE, c.getString(INTEREST_SENT_AGE)+"年");map.put(INTEREST_SENT_LOCATION, c.getString(INTEREST_SENT_LOCATION));//将 HashList 添加到 ArrayListdata.addAll(地图);}} catch (JSONException e) {e.printStackTrace();}} 别的 {Log.e("ServiceHandler", "无法从 url 获取任何数据");}返回数据;}@覆盖protected void onPostExecute(String result) {//TODO 自动生成的方法存根super.onPostExecute(result);maindata = chunkList(data, 50);Log.i("DATA", "maindata::" + maindata.size());适配器 = 新 CustomAdapterSent(maindata.get(count),MainActivity.this);listview.setAdapter(适配器);如果(mProgressbar.isShowing())mProgressbar.dismiss();}}@覆盖公共布尔 onCreateOptionsMenu(菜单菜单){//给菜单充气;如果它存在,这会将项目添加到操作栏.getMenuInflater().inflate(R.menu.main, menu);返回真;}@覆盖公共布尔 onOptionsItemSelected(MenuItem item) {//在此处处理操作栏项目的点击.操作栏将//自动处理 Home/Up 按钮上的点击,这么长时间//当您在 AndroidManifest.xml 中指定父活动时.int id = item.getItemId();如果(id == R.id.action_settings){返回真;}返回 super.onOptionsItemSelected(item);}

EndlessScoolListener.java

公共抽象类 EndlessScrollListener 实现 OnScrollListener {//低于当前滚动位置的最小项目数//在加载更多之前.私有 int 可见阈值 = 5;//已加载数据的当前偏移索引私人 int currentPage = 0;//上次加载后数据集中的项目总数private int previousTotalItemCount = 0;//如果我们仍在等待最后一组数据加载,则为真.私有布尔加载 = 真;//设置起始页索引私有 int 起始页索引 = 0;公共 EndlessScrollListener() {}公共 EndlessScrollListener(int可见阈值){this.visibleThreshold = 可见阈值;}public EndlessScrollListener(int可见阈值,int startPage){this.visibleThreshold = 可见阈值;this.startingPageIndex = startPage;this.currentPage = startPage;}//这种情况在滚动期间每秒发生多次,因此请注意您放置在此处的代码.//我们得到了一些有用的参数来帮助我们确定是否需要加载更多数据,//但首先我们检查我们是否在等待上一个加载完成.@覆盖public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){//如果总项目数为零而前一个不是,则假设//列表无效,应重置回初始状态如果(totalItemCount

CustomAdapterSent.java

公共类 CustomAdapterSent 扩展 BaseAdapter{

私有ArrayListmData = new ArrayList();私有上下文 mContext;私有 LayoutInflater inflater = null;私有静态最终字符串 TAG_NAME="name";私有静态最终字符串 TAG_PROFILE="profile_id";私有静态最终字符串 TAG_IMAGE="图像";私有静态最终字符串 TAG_CAST="cast";私有静态最终字符串 TAG_AGE="age";私有静态最终字符串 TAG_LOCATION="位置";public CustomAdapterSent(ArrayList mData, Context mContext) {this.mContext = mContext;this.mData = mData;充气器 = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}public void addAll(ArrayList mmData) {this.mData.addAll(mmData);this.notifyDataSetChanged();}@覆盖公共 int getCount() {//TODO 自动生成的方法存根返回 mData.size();}@覆盖公共对象 getItem(int arg0) {//TODO 自动生成的方法存根返回 mData.get(arg0);}@覆盖公共长 getItemId(int arg0) {//TODO 自动生成的方法存根返回0;}类 ViewHolder {公共文本视图 txtView;TextView txtproname;}@覆盖public View getView(int postion, View convertView, ViewGroup parent) {//TODO 自动生成的方法存根查看视图 = convertView;ViewHolder 支架;如果(视图==空){视图 = inflater.inflate(R.layout.row_layout, null);持有人 = 新的 ViewHolder();///holder.propic = (ImageView) convertView.findViewById(R.id.propicsent);//holder.txtproname = (TextView) convertView.findViewById(R.id.txtpronameintsent);//holder.txtproid = (TextView) convertView.findViewById(R.id.txtproidsent);//holder.txtprofilecast = (TextView) convertView.findViewById(R.id.txtprofilecastintsent);//holder.txtprofileage = (TextView) convertView.findViewById(R.id.txtprofileageintsent);//holder.txtprofileplace = (TextView) convertView.findViewById(R.id.txtprofileplaceintsent);holder.txtView = (TextView) view.findViewById(R.id.no_intsent);视图.setTag(持有人);} 别的 {持有人 = (ViewHolder) view.getTag();}Log.i("DATA", "mData.get(postion)::" + mData.get(postion));mData.get(位置);//holder.txtproname.setText(listData.get(position).get(TAG_NAME));holder.txtView.setText("索引::" + Integer.getInteger(TAG_NAME));返回视图;}}

XML 文件:

</ListView><文本视图android:layout_height="wrap_content"android:layout_width="wrap_content"机器人:layout_centerInParent =真"android:id="@+id/no_intsent"android:textColor="@android:color/black"android:background="@drawable/nomessaegborder"/><按钮android:layout_height="wrap_content"android:layout_width="wrap_content"android:text="加载更多"android:id="@+id/buttoloadmoreintsent"android:layout_below="@android:id/list"/></RelativeLayout>

解决方案

要在 ListView 中第一次仅显示 10 个项目并在滚动时显示更多项目,请执行以下步骤:

步骤 1: 创建一个 chunkList 方法,将 ArrayList 分成大小为 10 的部分:

static List>chunkList(List list, final int L) {List>部分 = 新的 ArrayList>();最终 int N = list.size();for (int i = 0; i 第 2 步: 创建 ArrayList 和一个显示当前部分的计数器:

private boolean isLoadingMore=false;Handler mHandler = new Handler();List>主数组列表;私有整数计数=0;

步骤 3: 在 onPostExecute 中打破 result 并在 ListView 中显示数据:

protected void onPostExecute(ArrayList result) {super.onPostExecute(result);//你的代码在这里...mainArrayList=chunkList(result,10);isLoadingMore=false;计数=0;适配器 = 新 CustomAdapterSent(Interestsent.this,mainArrayList.get(count));setListAdapter(适配器);}}

第 4 步: 在 Adapter 中创建 addAll 方法以在当前数据源中附加数据:

public void addAll(ArrayListmoreData){this.listData.addAll(moreData);this.notifyDataSetChanged();}

步骤 5: 在 onLoadMore 中加载更多数据到 ListView:

mHandler = new Handler();listview.setOnScrollListener(new EndlessScrollListener() {@覆盖public void onLoadMore(int page, int totalItemsCount) {if(count

I am developing one application. In my app I am using listview to display data from json. All the data display perfectly. But what I want is, to display first 10 objects and then loading items should show and then remaining 10 will display. My json response is as given below.

{ "interestsent": [ { "interestsent_user_id":369, "name":"abc", "profile_id":"686317", "image":"", }, { "interestsent_user_id":369, "name":"def", "profile_id":"686318", "image":"", }, { "interestsent_user_id":369, "name":"ghi", "profile_id":"686319", "image":"", }, { "interestsent_user_id":369, "name":"jkl", "profile_id":"686320", "image":"", }, { "interestsent_user_id":369, "name":"mno", "profile_id":"686321", "image":"", }, { "interestsent_user_id":369, "name":"pqr", "profile_id":"686322", "image":"", }, ................. ................. ] }

Interestsent.java

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); INTEREST_SENT_URL = "fshdfh/webservice/interestsent?version=apps&user_login_id=00"; new GetData().execute(""); listview = (ListView) findViewById(R.id.listview); Log.i("DATA", "page ::onCreate onCreate onCreate "); mHandler = new Handler(); listview.setOnScrollListener(new EndlessScrollListener() { @Override public void onLoadMore(int page, int totalItemsCount) { Log.i("DATA", "page :: " + page + " totalItemsCount :: " + totalItemsCount); mProgressbar = new ProgressDialog(MainActivity.this); mProgressbar.setMessage("Loading..."); mProgressbar.show(); count++; if (count < maindata.size()) { if (adapter != null) { if (!isLoadingMore) { isLoadingMore = true; mHandler.postDelayed(loadMoreRunnable, 1000); } } } } }); } Runnable loadMoreRunnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub if (count < maindata.size()) { if (adapter != null) { adapter.addAll(maindata.get(count)); mHandler.removeCallbacks(loadMoreRunnable); isLoadingMore = false; if (mProgressbar.isShowing()) mProgressbar.dismiss(); } } } }; static <T> ArrayList<ArrayList<T>> chunkList(List<T> list, final int L) { ArrayList<ArrayList<T>> parts = new ArrayList<ArrayList<T>>(); final int N = list.size(); for (int i = 0; i < N; i += L) { parts.add(new ArrayList<T>(list.subList(i, Math.min(N, i + L)))); } return parts; } private ProgressDialog mProgressbar; public class GetData extends AsyncTask<String, String, String> { ArrayList<Integer> data = new ArrayList<Integer>(); @Override protected void onPreExecute() { // TODO Auto-generated method stub mProgressbar = new ProgressDialog(MainActivity.this); mProgressbar.setMessage("Loading..."); mProgressbar.show(); super.onPreExecute(); } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub ArrayList<ArrayList<Integer>> data = new ArrayList<ArrayList<Integer>>(); ServiceHandler sh = new ServiceHandler(); /*try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ /*for (int i = 0; i < 500; i++) { data.add(i); } return null;*/ String jsonStr = sh.makeServiceCall(INTEREST_SENT_URL, ServiceHandler.GET); Log.d("Response: ", "> " + jsonStr); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); // Getting JSON Array node interestsent = jsonObj.getJSONArray(INTEREST_SENT); // looping through All Contacts for (int i = 0; i < interestsent.length(); i++) { JSONObject c = interestsent.getJSONObject(i); // creating new HashMap // HashMap<ArrayList<Integer> map = new HashMap<Integer>(); HashMap<String, String> map = new HashMap<String, String>(); // adding each child node to HashMap key => value map.put(INTEREST_USER_ID, c.getString(INTEREST_USER_ID)); map.put(INTEREST_SENT_NAME,c.getString(INTEREST_SENT_NAME)); map.put(INTEREST_SENT_PROFILE, c.getString(INTEREST_SENT_PROFILE)); map.put(INTEREST_SENT_IMAGE, c.getString(INTEREST_SENT_IMAGE)); map.put(INTEREST_SENT_CAST, c.getString(INTEREST_SENT_CAST)); map.put(INTEREST_SENT_AGE, c.getString(INTEREST_SENT_AGE)+" years"); map.put(INTEREST_SENT_LOCATION, c.getString(INTEREST_SENT_LOCATION)); // adding HashList to ArrayList data.addAll(map); } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("ServiceHandler", "Couldn't get any data from the url"); } return data; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); maindata = chunkList(data, 50); Log.i("DATA", "maindata :: " + maindata.size()); adapter = new CustomAdapterSent(maindata.get(count), MainActivity.this); listview.setAdapter(adapter); if (mProgressbar.isShowing()) mProgressbar.dismiss(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }

EndlessScroolListener.java

public abstract class EndlessScrollListener implements OnScrollListener { // The minimum amount of items to have below your current scroll position // before loading more. private int visibleThreshold = 5; // The current offset index of data you have loaded private int currentPage = 0; // The total number of items in the dataset after the last load private int previousTotalItemCount = 0; // True if we are still waiting for the last set of data to load. private boolean loading = true; // Sets the starting page index private int startingPageIndex = 0; public EndlessScrollListener() { } public EndlessScrollListener(int visibleThreshold) { this.visibleThreshold = visibleThreshold; } public EndlessScrollListener(int visibleThreshold, int startPage) { this.visibleThreshold = visibleThreshold; this.startingPageIndex = startPage; this.currentPage = startPage; } // This happens many times a second during a scroll, so be wary of the code you place here. // We are given a few useful parameters to help us work out if we need to load some more data, // but first we check if we are waiting for the previous load to finish. @Override public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount) { // If the total item count is zero and the previous isn't, assume the // list is invalidated and should be reset back to initial state if (totalItemCount < previousTotalItemCount) { this.currentPage = this.startingPageIndex; this.previousTotalItemCount = totalItemCount; if (totalItemCount == 0) { this.loading = true; } } // If it’s still loading, we check to see if the dataset count has // changed, if so we conclude it has finished loading and update the current page // number and total item count. if (loading && (totalItemCount > previousTotalItemCount)) { loading = false; previousTotalItemCount = totalItemCount; currentPage++; } // If it isn’t currently loading, we check to see if we have breached // the visibleThreshold and need to reload more data. // If we do need to reload some more data, we execute onLoadMore to fetch the data. if (!loading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + visibleThreshold)) { onLoadMore(currentPage + 1, totalItemCount); loading = true; } } // Defines the process for actually loading more data based on page public abstract void onLoadMore(int page, int totalItemsCount); @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // Don't take any action on changed } }

CustomAdapterSent.java

public class CustomAdapterSent extends BaseAdapter{

private ArrayList<Integer> mData = new ArrayList<Integer>(); private Context mContext; private LayoutInflater inflater = null; private static final String TAG_NAME="name"; private static final String TAG_PROFILE="profile_id"; private static final String TAG_IMAGE="image"; private static final String TAG_CAST="cast"; private static final String TAG_AGE="age"; private static final String TAG_LOCATION="location"; public CustomAdapterSent(ArrayList<Integer> mData, Context mContext) { this.mContext = mContext; this.mData = mData; inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void addAll(ArrayList<Integer> mmData) { this.mData.addAll(mmData); this.notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return mData.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } class ViewHolder { public TextView txtView; TextView txtproname; } @Override public View getView(int postion, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = convertView; ViewHolder holder; if (view == null) { view = inflater.inflate(R.layout.row_layout, null); holder = new ViewHolder(); ///holder.propic = (ImageView) convertView.findViewById(R.id.propicsent); // holder.txtproname = (TextView) convertView.findViewById(R.id.txtpronameintsent); //holder.txtproid = (TextView) convertView.findViewById(R.id.txtproidsent); //holder.txtprofilecast = (TextView) convertView.findViewById(R.id.txtprofilecastintsent); //holder.txtprofileage = (TextView) convertView.findViewById(R.id.txtprofileageintsent); // holder.txtprofileplace = (TextView) convertView.findViewById(R.id.txtprofileplaceintsent); holder.txtView = (TextView) view.findViewById(R.id.no_intsent); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } Log.i("DATA", "mData.get(postion) :: " + mData.get(postion)); mData.get(postion); // holder.txtproname.setText(listData.get(position).get(TAG_NAME)); holder.txtView.setText("Index :: " + Integer.getInteger(TAG_NAME)); return view; } }

XML File:

<RelativeLayout xmlns:android="schemas.android/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/relativemainss" android:background="@drawable/backg" > <ListView android:id="@android:id/list" android:layout_height="wrap_content" android:layout_width="wrap_content" android:dividerHeight="1dp"> </ListView> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_centerInParent="true" android:id="@+id/no_intsent" android:textColor="@android:color/black" android:background="@drawable/nomessaegborder" /> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Load More" android:id="@+id/buttoloadmoreintsent" android:layout_below="@android:id/list" /> </RelativeLayout>

解决方案

To Show only 10 item first time in ListView and show more items on scroll follow following steps:

STEP 1: Create a chunkList method which divide ArrayList in parts of size 10:

static <T> List<ArrayList<T>> chunkList(List<T> list, final int L) { List<ArrayList<T>> parts = new ArrayList<ArrayList<T>>(); final int N = list.size(); for (int i = 0; i < N; i += L) { parts.add(new ArrayList<T>( list.subList(i, Math.min(N, i + L))) ); } return parts; }

STEP 2: Create ArrayList and a counter which show current part :

private boolean isLoadingMore=false; Handler mHandler = new Handler(); List<ArrayList<HashMap<String,String>>> mainArrayList; private int count=0;

STEP 3: In onPostExecute break result and show data in ListView:

protected void onPostExecute(ArrayList<HashMap<String,String>> result) { super.onPostExecute(result); // your code here... mainArrayList=chunkList(result,10); isLoadingMore=false; count=0; adapter = new CustomAdapterSent(Interestsent.this, mainArrayList.get(count)); setListAdapter(adapter); } }

STEP 4: Create addAll method in Adapter to append data in current data source :

public void addAll(ArrayList<HashMap<String,String>> moreData){ this.listData.addAll(moreData); this.notifyDataSetChanged(); }

STEP 5: In onLoadMore load more data in ListView:

mHandler = new Handler(); listview.setOnScrollListener(new EndlessScrollListener() { @Override public void onLoadMore(int page, int totalItemsCount) { if(count<mainArrayList.size()-1) { if(adapter !=null){ count++; if(!isLoadingMore){ isLoadingMore=true; mHandler.postDelayed(loadMoreRunnable,1000); } } } } }); } Runnable loadMoreRunnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub if(count<mainArrayList.size()) { if(adapter !=null){ count++; adapter.addAll(mainArrayList.get(count)); mHandler.removeCallbacks(loadMoreRunnable); isLoadingMore=false; } } } };

更多推荐

无限滚动列表视图不起作用

本文发布于:2023-11-03 01:05:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1553866.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:视图   不起作用   列表

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!