package com.accesscompany.testlistadapter;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
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;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
/**
* 设置布局显示属性
*/
private LayoutParams mLayoutParams = 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;
// My Adapter, based on BaseAdapter
private MyListAdapter mAdapter = null;
private int lastItem = 0;
LinearLayout loadingLayout;
ListView mainList;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView we = (TextView) findViewById(R.id.wen);
SpannableStringBuilder style = new SpannableStringBuilder("谢红霞");
style.setSpan(new UnderlineSpan(), 0, 3,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
we.setText(style);
LinearLayout layout = new LinearLayout(this);
// 设置布局 水平方向
layout.setOrientation(LinearLayout.HORIZONTAL);
// 进度条
progressBar = new ProgressBar(this);
// 进度条显示位置
progressBar.setPadding(0, 0, 15, 0);
// 把进度条加入到layout中
// layout.addView(progressBar, mLayoutParams);
// 文本内容
TextView textView = new TextView(this);
textView.setText("展开更多");
textView.setGravity(Gravity.CENTER);
textView.setPadding(100, 10, 0, 20);
textView.setTextColor(Color.BLUE);
textView.setTextSize(20);
// 把文本加入到layout中
layout.addView(textView, FFlayoutParams);
// 设置layout的重力方向,即对齐方式是
layout.setGravity(Gravity.CENTER);
// 设置ListView的页脚layout
loadingLayout = new LinearLayout(this);
loadingLayout.addView(layout, mLayoutParams);
loadingLayout.setGravity(Gravity.CENTER);
loadingLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*
* if (adapter.count<=41) { adapter.count += 10;
* adapter.notifyDataSetChanged();
*
* }
*/
if (mAdapter.mData.size() < 50) {
for (int i = 0; i < 10; i++) {
MyListItem list_item = new MyListItem();
list_item.setTitle("商家XXX" + i);
list_item.setText("XXXXXXXXXX街道XXX楼" + i);
mAdapter.addItem(list_item);
}
mAdapter.notifyDataSetChanged();
} else {
mainList.removeFooterView(loadingLayout);
}
}
});
mAdapter = new MyListAdapter();
for (int i = 0; i < 10; i++) {
MyListItem list_item = new MyListItem();
list_item.setTitle("title" + i);
list_item.setText("text" + i);
mAdapter.addItem(list_item);
}
mainList = (ListView) findViewById(R.id.mainlist);
mainList.addFooterView(loadingLayout);
mainList.setAdapter(mAdapter);
mainList.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView v, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
Log.i(TAG, "Scroll>>>first: " + firstVisibleItem
+ ", visible: " + visibleItemCount + ", total: "
+ totalItemCount);
lastItem = firstVisibleItem + visibleItemCount - 1;
Log.i(TAG, "Scroll>>>lastItem:" + lastItem);
// 显示50条ListItem,即0-49,因为onScroll是在“滑动”执行过之后才触发,所以用adapter.count<=41作条件
/*
* if (adapter.count<=41) { if
* (firstVisibleItem+visibleItemCount==totalItemCount) {
* adapter.count += 10; adapter.notifyDataSetChanged();
* listView.setSelection(lastItem); int
* currentPage=adapter.count/10;
* Toast.makeText(getApplicationContext(), "第"+currentPage+"页",
* Toast.LENGTH_LONG).show(); } } else {
* listView.removeFooterView(loadingLayout); }
*/
}
@Override
public void onScrollStateChanged(AbsListView v, int state) {
if (lastItem == mAdapter.mData.size()
&& state == OnScrollListener.SCROLL_STATE_IDLE) {
/*
* Log.i(TAG,"ScrollStateChanged>>>state:"+state+"lastItem:"
* + lastItem);
* //显示50条ListItem,即0-49,因为onScrollStateChanged是在
* “拖动滑动”执行过之后才触发,所以用adapter.count<=41作条件 if
* (adapter.count<=41) { adapter.count += 10;
* adapter.notifyDataSetChanged();
*
* }else{ listView.removeFooterView(loadingLayout); }
*/
}
}
});
}
private OnClickListener listenBtnListener = new OnClickListener() {
public void onClick(View v) {
Log.i(TAG, "Clicked view: " + v + ", parent: " + v.getParent());
ViewHolder vh = (ViewHolder) ((View) v.getParent()).getTag();
AlertDialog.Builder ad = new AlertDialog.Builder(MainActivity.this);
ad.setTitle("Listen button clicked");
ad.setMessage("The " + vh.position + " listen button clicked");
ad.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(TAG, "Listen button click dialog disposing...");
}
});
ad.show();
}
};
private OnClickListener downloadBtnListener = new OnClickListener() {
public void onClick(View v) {
Log.i(TAG, "Clicked view: " + v + ", parent: " + v.getParent());
ViewHolder vh = (ViewHolder) ((View) v.getParent()).getTag();
AlertDialog.Builder ad = new AlertDialog.Builder(MainActivity.this);
ad.setTitle("Download button clicked");
ad.setMessage("The " + vh.position + " download button clicked");
ad.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(TAG, "Download button click dialog disposing...");
}
});
ad.show();
}
};
private class MyListAdapter extends BaseAdapter {
private ArrayList<MyListItem> mData = new ArrayList<MyListItem>();
private LayoutInflater mInflater;
public MyListAdapter() {
mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(MyListItem item) {
mData.add(item);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public MyListItem getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, "getView " + position + " " + convertView + "; parent: "
+ parent);
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.listitem_layout, null);
holder = new ViewHolder();
holder.tvTitle = (TextView) convertView
.findViewById(R.id.itemTitle);
holder.tvText = (TextView) convertView
.findViewById(R.id.itemText);
holder.btnDownload = (TextView) convertView
.findViewById(R.id.btnDownload);
holder.position = position;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvTitle.setText(mData.get(position).getTitle());
holder.tvText.setText(mData.get(position).getText());
holder.btnDownload.setText("不完整");
return convertView;
}
}
public class ViewHolder {
public TextView tvTitle;
public TextView tvText;
public TextView btnDownload;
public int position;
}
}
package com.accesscompany.testlistadapter;
public class MyListItem {
private String title = null;
private String text = null;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="100dip">
<TextView android:text="TextView01" android:layout_height="wrap_content"
android:textSize="18dip" android:textStyle="bold"
android:layout_marginLeft="13dip" android:layout_marginTop="10dip"
android:textColor="@color/blue" android:layout_width="200dip"
android:id="@+id/itemTitle" />
<TextView android:text="TextView02" android:textColor="@color/black"
android:textSize="18dip" android:layout_height="wrap_content"
android:layout_marginBottom="10dip"
android:paddingBottom="10dip"
android:layout_marginLeft="13dip"
android:layout_width="200dip" android:layout_below="@+id/itemTitle"
android:id="@+id/itemText" />
<TextView android:layout_width="60dip" android:layout_height="wrap_content"
android:id="@+id/btnDownload" android:layout_alignParentRight="true"
android:layout_centerVertical="true" android:focusable="false"
android:textColor="@color/black"
android:scaleType="fitCenter" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:background="@drawable/transparent_background"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<LinearLayout android:layout_width="wrap_content"
android:orientation="horizontal" android:layout_height="50dip">
<TextView android:text="重新定位" android:layout_width="220dip"
android:textColor="@color/blue" android:textSize="20dip"
android:paddingLeft="5dip" android:paddingTop="5dip"
android:layout_height="wrap_content" />
<TextView android:text="新建商家" android:layout_width="wrap_content"
android:id="@+id/wen"
android:layout_height="wrap_content" android:textColor="@color/blue"
android:textSize="20dip" android:paddingLeft="5dip"
android:paddingTop="5dip" android:layout_alignParentRight="true" />
</LinearLayout>
<LinearLayout android:layout_width="wrap_content"
android:orientation="horizontal" android:layout_height="50dip">
<EditText android:layout_width="200dip"
android:layout_marginLeft="20dip" android:id="@+id/at"
android:textColor="@color/black" android:textSize="20dip"
android:paddingLeft="5dip" android:paddingTop="5dip"
android:layout_height="wrap_content" />
<Button android:text="搜索" android:layout_width="80dip"
android:layout_height="wrap_content" android:textColor="@color/black"
android:textSize="20dip" android:paddingLeft="5dip"
android:paddingTop="5dip" android:layout_alignParentRight="true" />
</LinearLayout>
<ListView android:layout_width="wrap_content"
android:layout_height="300dip" android:cacheColorHint="#00000000"
android:divider="#000000" android:dividerHeight="1px"
android:stretchMode="columnWidth" android:id="@+id/mainlist">
</ListView>
<TextView android:text="选项" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textColor="@color/blue"
android:textSize="20dip" android:paddingLeft="235dip"
android:paddingTop="15dip" android:layout_alignParentRight="true" />
</LinearLayout>
分享到:
相关推荐
通过分析和理解这段代码,你可以更好地掌握在ListView中添加Footer View以及实现动态加载数据的方法。同时,这也是一个很好的实践案例,帮助你在实际项目中解决类似问题。记住,理解和熟练运用这些技术对于提升...
2. **监听滚动事件**:在ListView中,我们可以使用`OnScrollListener`来监听滚动事件。当用户滚动ListView时,`onScroll()`方法会被调用。我们需要在该方法中检查是否已达到底部。判断条件通常为:`listView....
"ListView下拉刷新,到底部自动加载更多"是移动应用中的常见功能,它提供了用户友好的体验,允许用户通过下拉动作更新列表数据,同时在滚动到底部时自动加载更多内容,这种特性通常被称为"无限滚动"或"自动分页加载...
将Switch嵌套在ListView中,可以实现用户通过点击列表条目来切换Switch的状态,从而提供更丰富的交互体验。以下是关于这个主题的详细知识点: 1. **ListView的使用**: - ListView是Android中的一个视图容器,主要...
总的来说,这个压缩包提供了一个Android ListView的实战案例,涵盖了无限滚动加载和返回顶部的功能,对于学习和理解Android开发中的ListView使用和优化具有很高的价值。在实际学习中,开发者应结合源代码和提供的...
总之,实现Android ListView滚动到底部自动加载数据涉及到的主要步骤包括:设置适配器、监听滚动事件、判断是否滚动到底部、加载新数据和更新列表。这个过程需要对Android的基础组件和数据操作有深入的理解,同时也...
综上所述,“listview上拉自动加载”是一个涉及到滚动监听、数据加载、列表更新等多个环节的功能实现,通过合理的设计和优化,可以极大地提升应用的用户体验。文件名称“FreshScroller”可能指的是一个与此功能相关...
本篇将详细讲解如何实现ListView的滑动自动加载功能,即“无限滚动”。 首先,我们要理解这个功能的基本原理:当用户滚动ListView到接近底部时,程序会自动请求更多的数据并将其添加到列表中。这个特性通常被称为...
当用户滚动到ListView的底部时,自动加载更多的数据功能通常被称为“无限滚动”或“下拉加载更多”。这个特性提高了用户体验,避免了用户手动刷新或点击加载按钮来获取新数据的不便。下面将详细解释如何实现ListView...
这样,ListView的条目在被触摸时就会自动显示高亮颜色,松开后恢复原状。 总结来说,"Android ListView条目点击变色demo"是一个关于如何在ListView中实现点击反馈的实例。它涉及到ListView的基础使用,包括设置...
它可能包含了一个完整的示例代码库,演示如何在ListView中集成这些特性。开发者可以通过研究这个项目来学习如何在自己的应用中实现类似的功能。 在实际开发中,考虑到ListView已经有些过时,现代的Android应用更...
本篇文章将深入探讨如何在ListView中实现这两种特性,以及相关的源码分析。 一、下拉刷新 下拉刷新功能通常在用户滚动列表到顶部时触发,更新数据并显示刷新状态。在Android中,我们通常使用SwipeRefreshLayout来...
总之,ListView加载多幅图片涉及到ImageList的使用,图片的加载和存储策略,以及性能优化。通过合理的编程实践,可以创建出流畅且高效的图片展示效果。同时,理解并掌握这些知识点对于开发高质量的UI界面至关重要。
总结,分批加载和自动加载是Android开发中优化ListView性能的重要手段。它们通过动态加载数据,减少了内存消耗,提高了应用的响应速度。同时,结合提供的源码,开发者可以更直观地学习和实践这些技术,从而在实际...
本文将深入探讨如何使用Handler+线程和AsyncTask两种方法来实现ListView的动态加载分页。 首先,我们来看看Handler+线程的实现方式。在主线程中,我们不能直接进行耗时操作,如网络请求或数据库查询,因为这会导致...
在Android开发中,ListView是一...综上,"ListView实现动态加载"涵盖了Android开发中的数据适配、视图复用、异步加载、滚动监听、内存优化等多个重要知识点。熟练掌握这些技巧,对于构建流畅、高效的列表界面至关重要。
总之,通过为ListView设置加载中、空数据和加载失败三种状态的显示,可以显著提升应用的用户体验。开发者应当学会灵活运用这些技巧,确保在各种情况下都能给用户提供清晰的反馈和操作指引。同时,分析并学习`Android...
通过以上步骤和注意事项,我们可以有效地在ListView中实现动态加载和滑动加载功能,为用户提供流畅的滚动体验。在实际项目中,还可以根据需求进行优化,如使用RecyclerView替代ListView,或者采用更高效的加载策略。
在Android开发中,...综上所述,滑到底部自动加载的ListView是Android开发中的一个实用功能,涉及到滚动事件监听、网络请求、数据处理等多个环节。开发者需要熟练掌握这些技术,以提供流畅且功能丰富的用户体验。