转载 http://yangguangfu.iteye.com/blog/832809
滚动方式:
package com.yangguangfu.listview; import android.app.ListActivity; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.AbsListView.OnScrollListener; import android.widget.LinearLayout.LayoutParams; /** * * @author 阿福 * */ public class MainActivity extends ListActivity implements OnScrollListener { private static final String TAG = "MainActivity"; private listViewAdapter adapter = new listViewAdapter(); private int lastItem = 0; /** * 设置布局显示为目标有多大就多大 */ private LayoutParams WClayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); /** * 设置布局显示目标最大化 */ private LayoutParams FFlayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT); private ProgressBar progressBar; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate(Bundle savedInstanceState)" ); //线性布局 LinearLayout layout = new LinearLayout(this); //设置布局 水平方向 layout.setOrientation(LinearLayout.HORIZONTAL); //进度条 progressBar = new ProgressBar(this); //进度条显示位置 progressBar.setPadding(0, 0, 15, 0); layout.addView(progressBar, WClayoutParams); TextView textView = new TextView(this); textView.setText("加载中..."); textView.setGravity(Gravity.CENTER_VERTICAL); layout.addView(textView, FFlayoutParams); layout.setGravity(Gravity.CENTER); LinearLayout loadingLayout = new LinearLayout(this); loadingLayout.addView(layout, WClayoutParams); loadingLayout.setGravity(Gravity.CENTER); //得到一个ListView用来显示条目 ListView listView = getListView(); //添加到脚页显示 listView.addFooterView(loadingLayout); // registerForContextMenu(listView); // setListAdapter(adapter); listView.setOnScrollListener(this); } public void onScroll(AbsListView v, int firstVisibleItem, int visibleItemCount, int totalItemCount) { lastItem = firstVisibleItem + visibleItemCount - 1; System.out.println("lastItem:" + lastItem); Log.i(TAG, "lastItem:" + lastItem); } public void onScrollStateChanged(AbsListView v, int state) { if (lastItem == adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE) { adapter.count += 10; adapter.notifyDataSetChanged(); Log.i(TAG, "lastItem:" + lastItem); } } /** * 要用用于生成显示数据 * @author 阿福 * */ class listViewAdapter extends BaseAdapter { int count = 10; public int getCount() { Log.i(TAG, "count:" + count); return count; } public Object getItem(int pos) { Log.i(TAG, "pos:" + pos); return pos; } public long getItemId(int pos) { return pos; } public View getView(int pos, View v, ViewGroup p) { TextView view = new TextView(MainActivity.this); view.setText("阿福播放器 " + pos); Log.i(TAG, "entry: " + pos); view.setTextSize(20f); view.setHeight(80); return view; } } }
单击按钮直接加载
package com.yangguangfu.listview; import android.app.ListActivity; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.LinearLayout.LayoutParams; /** * * @author 阿福 * */ public class ButtonLoadingActivity extends ListActivity { private static final String TAG = "ButtonLoadingActivity"; private listViewAdapter adapter = new listViewAdapter(); /** * 设置布局显示为目标有多大就多大 */ private LayoutParams WClayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); /** * 设置布局显示目标最大化 */ private LayoutParams FFlayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate(Bundle savedInstanceState):" ); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.HORIZONTAL); Button button = new Button(this); button.setText("点击加载下五条..."); button.setGravity(Gravity.CENTER_VERTICAL); layout.addView(button,FFlayoutParams); layout.setGravity(Gravity.CENTER); LinearLayout loadingLayout = new LinearLayout(this); loadingLayout.addView(layout,WClayoutParams); loadingLayout.setGravity(Gravity.CENTER); ListView listView = getListView(); listView.addFooterView(loadingLayout); button.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { adapter.count += 5; Log.i(TAG, "setOnClickListener:" + adapter.count); adapter.notifyDataSetChanged(); } }); setListAdapter(adapter); } public void onScrollStateChanged(AbsListView v, int s) { Log.i(TAG, "onScrollStateChanged(AbsListView v, int s)"); } class listViewAdapter extends BaseAdapter { int count = 10; /* starting amount */ public int getCount() { return count; } public Object getItem(int pos) { return pos; } public long getItemId(int pos) { return pos; } public View getView(int pos, View v, ViewGroup p) { TextView textView = new TextView(ButtonLoadingActivity.this); textView.setHeight(80); textView.setTextSize(20); textView.setText("阿福播放器 " + pos); Log.i(TAG, "getView:pos:" + pos); return textView; } } }
相关推荐
为了增强用户体验和数据组织的清晰性,我们有时需要在ListView中添加分段标头(Section Header)。标题“为ListView添加分段标头”涉及到的就是如何在ListView中实现这种功能,使得用户能更方便地浏览和定位数据。 ...
综上所述,"简单的分段加载,下拉刷新"这一功能虽然看似简单,但涉及到Android UI组件、手势识别、网络请求、数据处理等多个方面,需要开发者具备扎实的Android开发基础和良好的用户体验设计意识。通过不断学习和...
在Android开发中,ListView是一...总之,实现ListView的分段显示和拉到末尾自动刷新功能,需要结合Adapter、OnScrollListener以及自定义的数据加载逻辑。通过这样的设计,我们可以为用户提供更加流畅和便捷的交互体验。
开发工具:vc++6.0 开发语言:c++ 主要功能:实现了仿windows资源管理器功能,通过txt文件生成左侧树结构,点击树节点右侧listview...由于数据较多所以采用分段加载节点,也就是在需要展开节点时加载该节点下的节点。
关于ListView的分段显示,有现成的库可用,比如 cwac-endless, 这个库不好之处,就是底部Loading的View无法定制。还有一个在google code上的androidpageablelistview 这个可以实现基本的分页,有手动操作显示上一页...
总的来说,要在ListView中添加多个不同的Adapter,可以通过组合Adapter、使用Header/Footer或者创建分段ListView来实现。"SectionedDemo"项目很可能是展示了最后一种方法,即通过自定义一个SectionedAdapter来管理多...
在处理大量数据时,为了提高性能,你可以采用异步加载或者分页加载策略。同时,通过使用ViewHolder模式,可以减少视图的创建和查找,提升列表的滚动流畅性。 **交互设计** 为了提供良好的用户体验,还可以考虑以下...
关于ListView的分段显示,有现成的库可用,比如 cwac-endless, 这个库不好之处,就是底部Loading的View无法定制。还有一个在google code上的androidpageablelistview 这个可以实现基本的分页,有手动操作显示上一页...
- `ListView` 支持头尾分段、选择模式、自定义视图等多种功能。 3. **结合使用**: - 在 `ViewPager` 中嵌套 `ListView`,需要自定义 `ViewPager` 的页面,每个页面就是一个包含 `ListView` 的布局。 - 自定义的...
- ListView是Android SDK中的一个视图容器,它可以动态加载数据并根据屏幕大小滚动显示。 - 通过设置Adapter(如ArrayAdapter或BaseAdapter)将数据与ListView关联,Adapter负责将数据转化为ListView的Item视图。 ...
- 当ListView内容过多时,不一次性加载所有数据,而是根据用户滚动情况,分段加载。可以通过监听`onScrollListener()`,在滚动到列表底部时加载更多内容。 5. **分页加载**: - 服务器端和数据库端应提供分页接口...
7. **布局管理**: 对于header的布局,通常会在XML中创建一个独立的布局文件,然后在Adapter中加载这个布局。也可以通过代码动态创建和添加View。 8. **事件处理**: 需要确保header视图上的点击事件能够正常响应,这...
getSections()返回一个包含所有分段(即字母)的数组,getPositionForSection(int section)返回指定分段的第一个元素的位置,getSectionForPosition(int position)则返回给定位置元素所属的分段。 实现...
5. **适配器调整**:如果ListView的数据源来自网络或其他异步加载,可能需要在数据加载完成后再设置Adapter,以防止ScrollView在数据未准备好时就开始滚动。 通过这个“ListViewForScrollView”的实现,开发者可以...
8. **分段加载**:对于极长的图片,可以将其分割成多个部分,每次只加载和显示当前可视范围内的图片部分,这样可以大大降低内存需求。 9. **渐进式加载**:对于网络加载的大图,可以使用渐进式加载技术,先加载低...
Android系统会根据需要动态地加载和回收这些视图,以优化内存使用。开发者通常需要定义一个Adapter来填充ListView,Adapter将数据集与ListView的视图绑定。 在这个例子中,我们可能有一个包含城市名的ArrayList,每...
- **延时加载**:当`ListView`包含大量数据时,可以采用分段加载的方式,即只加载当前屏幕上可见的数据,当用户滚动到新的区域时再加载新的数据。 - **分页显示**:服务器端提供分页接口,客户端按需请求数据,...
2. **Sectioning**:固定部分的实现涉及到将数据分段,其中一部分被固定在顶部。这需要在Adapter中实现逻辑来识别哪些数据应该被当作“section”。 3. **View Holder**:为了提高ListView的性能,项目可能使用了...
- 为了提高性能,可以使用分段(Section)的适配器,这种适配器会根据首字母将数据分成多个部分,每部分对应ListView的一个子View。这样在滚动时,只加载可见部分的数据,减少内存消耗。 8. **动画效果**: - ...
关于ListView的分段显示,有现成的库可用,比如 cwac-endless, 这个库不好之处,就是底部Loading的View无法定制。还有一个在google code上的androidpageablelistview 这个可以实现基本的分页,有手动操作显示上一页...