Android之ListView
- 格式:doc
- 大小:365.50 KB
- 文档页数:4
Android基础篇之在ListView中显示网络图片大家知道ImageView 类虽然有一个setImageUri 方法,但不能直接接受一个由网络地址生成的uri 作为参数从而显示图片,我们只好使用其 setImageBitmap 方法,如view plaincopy to clipboardprint?1.BitmapmBitmap=null;2.3.URLurl=new URL(imageUrl);4.5.HttpURLConnectionconn=(HttpURLConnection)url.openConnection();6.7.InputStream is=conn.getInputStream();8.9.mBitmap=BitmapFactory.decodeStream(is);在SimpleAdapter中需要一个数据源,用来存储数据的,在显示图片时我们要用HashMap<>存储一个Bitmap;但仅存取了Bitmap时在ListView中是无法显示图片的,我们需要对SimpleAdapter进行处理 。
如下是对SimpleAdaptr处理的主要代码:view plaincopy to clipboardprint?1.adapter.setViewBinder(new ViewBinder(){2.3.publicboolean setViewValue(Viewview,Objectdata,4.StringtextRepresentation){5.//判断是否为我们要处理的对象6.if(view instanceof ImageView&&data instanceof Bitmap){7.ImageViewiv=(ImageView)view;8.9.iv.setImageBitmap((Bitmap)data);10.returntrue;11.}else12.returnfalse;13.}14.});看API对Android.widget.SimpleAdapter.ViewBinder的解释:This class can be used by external clients of SimpleAdapter to bind values to views. You should use this class to bind values to views that are not directly supported by SimpleAdapter or to change the way binding occurs for views supported by SimpleAdapter.你可以使用该类来处理SimpleAdapter不直接支持的数据;下面来看看完整的代码:main.xml 中就是一个ListView , list_item.xml 是为ListView中控件提供布局 ,就是一个ImageView。
Android ListView优化实践在看了一些vogella的文章之后,发现关于android listview性能优化这一段很有意思,于是实践了一下,经过优化,性能确实提升不少!先看看优化前和优化后的比较:优化前的log截图:优化后的log截图:并且,在不停滚动ListView的过程中,优化之前会出现ANR现象,在A VD上特别容易复现:然后,优化后显得很流畅,附上对于的log截图:下面附上相关代码分析:ListView中的每一个Item由一个ImageView 和一个TextView组成Layout:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal" ><ImageView android:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="fill_parent" />"<TextView android:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_marginLeft="15dp"android:gravity="center_vertical" /></LinearLayout>Activity继承自ListActivity,我故意增加了Item,方便测试,效果更明显:public class ListViewDemo extends ListActivity{private final String[] mItems = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7","Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X","Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu","Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7","Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X","Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu","Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7","Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X","Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu","Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7","Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X","Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu","Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7","Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X","Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu","Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7","Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X","Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu","Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7","Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X","Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ListViewArrayAdapter adapter = new ListViewArrayAdapter(this, mItems);getListView().setAdapter(adapter);}}然后custom Adapter,优化之前的adapter:@Overridepublic View getView(int position, View convertView, ViewGroup parent) {long start = System.currentTimeMillis();LayoutInflater inflater = (LayoutInflater) mContext.getLayoutInflater();View rowView = inflater.inflate(mViewResourceId, parent, false);TextView textView = (TextView) rowView.findViewById(mTextViewResourceId);ImageView imageView = (ImageView) rowView.findViewById(mImageViewResourceId);textView.setText(mNames[position]);String s = mNames[position];if (s.startsWith("Windows7") || s.startsWith("iPhone")) { imageView.setImageResource(R.drawable.no);} else {imageView.setImageResource(R.drawable.yes);}Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start));return rowView;}优化之后的Adapter:public class ListViewArrayAdapter extends ArrayAdapter<String>{private final Activity mContext;private final String[] mNames;private final static int mViewResourceId = yout.text_image_row_layout;private final static int mTextViewResourceId = R.id.textView;private final static int mImageViewResourceId = R.id.imageView;static class ViewHolder {public TextView text;public ImageView image;}public ListViewArrayAdapter(Activity context, String[] names) {super(context, mViewResourceId, names);this.mContext = context;this.mNames = names;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {long start = System.currentTimeMillis();View rowView = convertView;if (rowView == null) {LayoutInflater inflater = mContext.getLayoutInflater();rowView = inflater.inflate(mViewResourceId, null);ViewHolder viewHolder = new ViewHolder();viewHolder.text = (TextView) rowView.findViewById(mTextViewResourceId);viewHolder.image = (ImageView) rowView.findViewById(mImageViewResourceId);rowView.setTag(viewHolder);}ViewHolder holder = (ViewHolder) rowView.getTag();String s = mNames[position];holder.text.setText(s);if (s.startsWith("Windows7") || s.startsWith("iPhone")) { holder.image.setImageResource(R.drawable.no);} else {holder.image.setImageResource(R.drawable.yes);}Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start));return rowView;}}优化的大致思想就是:优化之前,每次加载item的时候,都要加载一下布局文件,然后生成一个新的row View对象,然后通过View找到对应的ImageView和TextView,正如我们所知道的那样,加载布局文件时很耗时的,特别是在操作比较频繁情况下,这是不可忍受的,所以会导致ANR现象。
android listview的用法
Android中的ListView是一种可以显示垂直列表的滚动控件。
它为用户提供了一种可以浏览许多项目,而无需滚动屏幕的便捷方式。
ListView通常用来显示一组有序的数据,这些数据可以是文本,图像,或者其他任意形式的内容。
ListView可以包含任意数量的项目,而不会对屏幕上的性能造成影响。
使用ListView时,必须将它与ArrayAdapter(或其他类型的适配器)结合起来,这样ListView才能正确地显示数据。
ArrayAdapter可以将数据转换为ListView可以显示的格式。
要实现ListView,首先要在布局文件中定义ListView,然后在Activity中初始化ListView,并将ArrayAdapter与ListView绑定。
最后,可以为ListView 注册一个OnItemClickListener监听器,用于处理项目被单击时发生的事件。
Android 中的ListView选中项的背景颜色怎么设置?android中ListView获得焦点的项默认是黄色的(模拟器上)现在因为需求想要自己定义被选中项的背景能实现吗?最佳答案完全可以实现,这用到了Android的Selector(根据组件的状态显示该状态对应的图片,并以此图片作为背景显示)。
把下面的XML文件保存成你自己命名的.xml文件(比如list_bg.xml),注意,这个文件相当于一个背景图片选择器,在系统使用时根据 ListView中的列表项的状态来使用相应的背景图片,什么情况使用什么图片我在下面都进行了说明。
还有,你可以把它看成是一个图片来使用,放于 drawable目录下,配置背景属性android:background="@drawable/list_bg"就能达到你需要的目的了。
<?xml version="1.0" encoding="utf-8" ?><selector xmlns:android="/apk/res/android"> <item android:state_window_focused="false"android:drawable="@drawable/没有焦点时图片背景" /><item android:state_focused="true"android:state_pressed="true" <!--双条件-->android:drawable="@drawable/非触摸模式下获得焦点并单击时的背景图片" /><item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/触摸模式下单击时的背景图片" /><item android:state_selected="true" android:drawable="@drawable/选中时的图片背景" /><item android:state_focused="true" android:drawable="@drawable/获得焦点时的图片背景" /><item android:drawable="@drawable/silver" /> <!--default color --> </selector>---------------------------------------------------------------------------------------------------------------在values下新建一个color.xml<?xml version="1.0" encoding="utf-8"?><resources><drawable name="darkgray">#808080FF</drawable><drawable name="white">#FFFFFFFF</drawable><drawable name="silver">#00ffffff</drawable> <!-- 透明色 --></resources>-------------------------------------------------------------------------------------------------------------------------------------------------main布局文件中的系统 ListView 控件,注意这不是 ListViewItem 控件。
listview使用方法listview是android开发中最常用的控件之一,它可以以列表形式展示数据,并且可以支持用户的滑动和点击操作。
在本篇文章中,我们将介绍listview的使用方法以及常用属性和方法。
1. 布局文件中添加listview在布局文件中添加以下代码,即可创建一个简单的listview。
```<ListViewandroid:id='@+id/list_view'android:layout_width='match_parent'android:layout_height='match_parent' />```2. 创建适配器适配器是listview展示数据的关键。
我们需要创建一个适配器,并在适配器中实现数据的绑定和显示。
```public class MyAdapter extends BaseAdapter {private List<String> mData;public MyAdapter(List<String> data) {mData = data;}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {convertView =LayoutInflater.from(parent.getContext()).inflate(yout.i tem_layout, parent, false);viewHolder = new ViewHolder();viewHolder.mTextView =convertView.findViewById(R.id.text_view);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.mTextView.setText(mData.get(position));return convertView;}private static class ViewHolder {private TextView mTextView;}}```在适配器中,我们通过实现BaseAdapter类的方法来为listview 绑定数据。
listview控件的滚动用法
Listview控件是Android开发中非常常见的一种控件,它可以
将一组数据在界面上以列表的形式展现出来。
在使用Listview控件时,我们经常会遇到需要滚动列表的情况,这时候我们可以利用Listview提供的一些方法来完成滚动操作。
1. scrollTo()方法
scrollTo()方法可以将列表滚动到指定的位置。
它接受两个参数,第一个参数为x轴方向的偏移量,第二个参数为y轴方向的偏移量。
例如,我们可以使用以下代码将列表滚动到第5个item的位置:
listView.scrollTo(0, 5 * itemViewHeight);
2. smoothScrollToPosition()方法
smoothScrollToPosition()方法可以将列表平滑滚动到指定位置。
它接受一个参数,即要滚动到的item的位置。
例如,我们可以
使用以下代码将列表平滑滚动到第5个item的位置:
listView.smoothScrollToPosition(5);
3. setSelection()方法
setSelection()方法可以将指定位置的item滚动到列表的可见
区域内。
它接受一个参数,即要滚动到的item的位置。
例如,我们
可以使用以下代码将第5个item滚动到列表的可见区域内:
listView.setSelection(5);
总之,Listview控件的滚动用法非常简单,只需要调用相应的
方法即可。
在实际开发中,我们可以根据具体的业务需求来选择合适
的滚动方法。
Android listview与adapter用法listview与adapter用法博客分类:android一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
第一点很好理解,ListView就是实现这个功能的。
第二点也不难做到,在后面的学习中读者会发现,这非常简单。
一个ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
也就是说,要使用ListView,首先要了解什么是适配器。
适配器是一个连接数据和AdapterView (ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便Android中提供了很多的Adapter,表4-5列出了常用的几个。
其实适配器还有很多,要注意的是,各种Adapter只不过是转换的方式和能力不一样而已。
下面就通过使用不同的Adapter来为ListView绑定数据(SimpleCursorAdapter暂且不讲,后面讲SQLite 时会介绍)。
4.12.1 ListView使用ArrayAdapter用ArrayAdapter可以实现简单的ListView的数据绑定。
默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件上。
ArrayAdapter的使用非常简单。
实例:工程目录:EX_04_12在布局文件中加入一个ListView控件。
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"><!-- 添加一个ListView控件--><ListViewandroid:id="@+id/lv"android:layout_width="fill_parent"android:layout_height="fill_parent"/></LinearLayout>然后在Activity中初始化。
花了一天时间写出了这个类来实现下拉刷新。
首先这是一个自定义的listView控件类,我在许多项目中都用到了它,效果很稳定。
实现也很简单。
用的时候其他功能都和系统提供的ListView一样,就只是多了一个下拉刷新监听。
用这个类替代系统提供的ListView,下拉刷新再也不会烦恼了。
\(^o^)/~希望对大家有用。
我写的自定义ListView的代码:import java.util.Date;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import youtInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.LinearInterpolator;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ProgressBar;import android.widget.TextView;public class MyListView extends ListView implements OnScrollListener {private static final String TAG = "listview";private final static int RELEASE_To_REFRESH = 0;private final static int PULL_To_REFRESH = 1;private final static int REFRESHING = 2;private final static int DONE = 3;private final static int LOADING = 4;// 实际的padding的距离与界面上偏移距离的比例private final static int RATIO = 3;private LayoutInflater inflater;private LinearLayout headView;private TextView tipsTextview;private TextView lastUpdatedTextView;private ImageView arrowImageView;private ProgressBar progressBar;private RotateAnimation animation;private RotateAnimation reverseAnimation;// 用于保证startY的值在一个完整的touch事件中只被记录一次private boolean isRecored;private int headContentWidth;private int headContentHeight;private int startY;private int firstItemIndex;private int state;private boolean isBack;private OnRefreshListener refreshListener;private boolean isRefreshable;public MyListView(Context context) {super(context);init(context);}public MyListView(Context context, AttributeSet attrs) { super(context, attrs);init(context);}private void init(Context context) {setCacheColorHint(context.getResources().getColor(R.color.tran sparent));inflater = LayoutInflater.from(context);headView= (LinearLayout) inflater.inflate(yout.head, null);arrowImageView = (ImageView) headView.findViewById(R.id.head_arrowImageView);arrowImageView.setMinimumWidth(70);arrowImageView.setMinimumHeight(50);progressBar = (ProgressBar) headView.findViewById(R.id.head_progressBar);tipsTextview = (TextView)headView.findViewById(R.id.head_tipsTextView);lastUpdatedTextView = (TextView) headView.findViewById(R.id.head_lastUpdatedTextView);measureView(headView);headContentHeight = headView.getMeasuredHeight();headContentWidth = headView.getMeasuredWidth();headView.setPadding(0, -1 * headContentHeight, 0, 0);headView.invalidate();Log.v("size", "width:" + headContentWidth + " height:"+ headContentHeight);addHeaderView(headView, null, false);setOnScrollListener(this);animation = new RotateAnimation(0, -180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);animation.setInterpolator(new LinearInterpolator());animation.setDuration(250);animation.setFillAfter(true);reverseAnimation = new RotateAnimation(-180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);reverseAnimation.setInterpolator(new LinearInterpolator());reverseAnimation.setDuration(200);reverseAnimation.setFillAfter(true);state = DONE;isRefreshable = false;}public void onScroll(AbsListView arg0, int firstVisiableItem, int arg2,int arg3) {firstItemIndex = firstVisiableItem;}public void onScrollStateChanged(AbsListView arg0, int arg1) { }public boolean onTouchEvent(MotionEvent event) {if (isRefreshable) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (firstItemIndex == 0 && !isRecored) {isRecored = true;startY = (int) event.getY();Log.v(TAG, "在down时候记录当前位置‘");}break;case MotionEvent.ACTION_UP:if (state != REFRESHING && state != LOADING) { if (state == DONE) {// 什么都不做}if (state == PULL_To_REFRESH) {state = DONE;changeHeaderViewByState();Log.v(TAG, "由下拉刷新状态,到done状态");}if (state == RELEASE_To_REFRESH) {state = REFRESHING;changeHeaderViewByState();onRefresh();Log.v(TAG, "由松开刷新状态,到done状态");}}isRecored = false;isBack = false;break;case MotionEvent.ACTION_MOVE:int tempY = (int) event.getY();if (!isRecored && firstItemIndex == 0) {Log.v(TAG, "在move时候记录下位置");isRecored = true;startY = tempY;}if(state!= REFRESHING&& isRecored&& state!= LOADING) {// 保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动// 可以松手去刷新了if (state == RELEASE_To_REFRESH) {setSelection(0);// 往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步if(((tempY - startY) / RATIO< headContentHeight)&& (tempY - startY) > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();Log.v(TAG, "由松开刷新状态转变到下拉刷新状态");}// 一下子推到顶了else if (tempY - startY <= 0) {state = DONE;changeHeaderViewByState();Log.v(TAG, "由松开刷新状态转变到done状态");}// 往下拉了,或者还没有上推到屏幕顶部掩盖head的地步else {// 不用进行特别的操作,只用更新paddingTop的值就行了}}// 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态if (state == PULL_To_REFRESH) {setSelection(0);// 下拉到可以进入RELEASE_TO_REFRESH的状态if((tempY - startY) / RATIO>= headContentHeight) {state = RELEASE_To_REFRESH;isBack = true;changeHeaderViewByState();Log.v(TAG, "由done或者下拉刷新状态转变到松开刷新");}// 上推到顶了else if (tempY - startY <= 0) {state = DONE;changeHeaderViewByState();Log.v(TAG, "由DOne或者下拉刷新状态转变到done状态");}}// done状态下if (state == DONE) {if (tempY - startY > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();}}// 更新headView的sizeif (state == PULL_To_REFRESH) {headView.setPadding(0, -1 * headContentHeight+ (tempY - startY) / RATIO, 0, 0);}// 更新headView的paddingTopif (state == RELEASE_To_REFRESH) {headView.setPadding(0, (tempY - startY) / RATIO- headContentHeight, 0, 0);}}break;}}return super.onTouchEvent(event);}// 当状态改变时候,调用该方法,以更新界面private void changeHeaderViewByState() {switch (state) {case RELEASE_To_REFRESH:arrowImageView.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.startAnimation(animation);tipsTextview.setText("松开刷新");Log.v(TAG, "当前状态,松开刷新");break;case PULL_To_REFRESH:progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.VISIBLE);// 是由RELEASE_To_REFRESH状态转变来的if (isBack) {isBack = false;arrowImageView.clearAnimation();arrowImageView.startAnimation(reverseAnimation);tipsTextview.setText("下拉刷新");} else {tipsTextview.setText("下拉刷新");}Log.v(TAG, "当前状态,下拉刷新");break;case REFRESHING:headView.setPadding(0, 0, 0, 0);progressBar.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.GONE);tipsTextview.setText("正在刷新...");lastUpdatedTextView.setVisibility(View.VISIBLE);Log.v(TAG, "当前状态,正在刷新...");break;case DONE:headView.setPadding(0, -1 * headContentHeight, 0, 0);progressBar.setVisibility(View.GONE);arrowImageView.clearAnimation();arrowImageView.setImageResource(R.drawable.arrow);tipsTextview.setText("下拉刷新");lastUpdatedTextView.setVisibility(View.VISIBLE);Log.v(TAG, "当前状态,done");break;}}public void setonRefreshListener(OnRefreshListener refreshListener) {this.refreshListener = refreshListener;isRefreshable = true;}public interface OnRefreshListener {public void onRefresh();}public void onRefreshComplete() {state = DONE;lastUpdatedTextView.setText("最近更新:"+ new Date().toLocaleString());changeHeaderViewByState();}private void onRefresh() {if (refreshListener != null) {refreshListener.onRefresh();}}// 此方法直接照搬自网络上的一个下拉刷新的demo,此处是“估计”headView的width以及heightprivate void measureView(View child) {youtParams p = child.getLayoutParams();if (p == null) {p = new youtParams(youtParams.FILL_PARENT,youtParams.WRAP_CONTENT);}int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);int lpHeight = p.height;int childHeightSpec;if (lpHeight > 0) {childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,MeasureSpec.EXACTLY);} else {childHeightSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);}child.measure(childWidthSpec, childHeightSpec);}public void setAdapter(BaseAdapter adapter) {lastUpdatedTextView.setText("最近更新:"+ new Date().toLocaleString());super.setAdapter(adapter);}}这个类到此结束了,你可以在项目中建一个类把此类拷贝进去,作为你自定义的listView 使用就可以了。
public class ListView extends Activity {/** Called when the activity is first created. */private List<;String>; list = new ArrayList<;String>;();private TextView myTextView;private Spinner mySpinner;private ArrayAdapter<;String>; adapter;private Animation au;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);//第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项list.add(";北京"; );list.add(";上海"; );list.add(";深圳"; );list.add(";南京"; );list.add(";重庆"; );myTextView = (TextView)findViewById(R.id.textview);mySpinner = (Spinner)findViewById(R.id.Spinner01);au=AnimationUtils.loadAnimation(this,R.anim.my_anim);//第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。
adapter = new ArrayAdapter<;String>;( this ,yout.simple_spinner_item, list);//第三步:为适配器设置下拉列表下拉时的菜单样式。
列表详解列表的显示需要三个元素:1.ListV eiw,用来展示列表的View。
2.适配器,用来把数据映射到ListView 上的中介。
3.数据,具体的将被映射的字符串、图片、或者基本组件。
知识点:1.ListView,是Android中比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
2.Adapter:Android中的Adapter可以这样理解,它是数据List和视图ListView之间的桥梁,数据在Adapter中做处理,然后显示到视图上面来。
Adapter有很多种。
列表的适配器分为三种类型:ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。
●ArrayAdapter最为简单,只能展示一行字。
●SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
●SimpleAdapter有最好的扩充性,可以自定义出各种效果。
3.List:●所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-V alue键值对。
例如:[ tom,1,c ],List中取出的都是Object对象。
●所有的List中可以有相同的元素,例如V ector中可以有[ tom,koo,too,koo ]。
●所有的List中可以有null元素,例如[ tom,null,1 ]。
●基于Array的List(V ector,ArrayList)适合查询。
●List基本上都是以Array为基础。
ListView使用的例子如下图:一、最简单的ListView1.package com.demo;2.import java.util.ArrayList;3.import java.util.List;4.import android.app.Activity;5.import android.os.Bundle;6.import android.widget.ArrayAdapter;7.import android.widget.ListView;8.public class MyListView extends Activity {9.private ListView listView;10.@Override11.public void onCreate(Bundle savedInstanceState){12.super.onCreate(savedInstanceState);13.listView = new ListView(this);14.listView.setAdapter(new ArrayAdapter<String>(this,yout.simple_expandable_list_item_1,getData()));15.setContentView(listView);16.}17.private List<String> getData(){18.List<String> data = new ArrayList<String>();19.data.add("测试数据1");20.data.add("测试数据2");21.data.add("测试数据3");22.data.add("测试数据4");23.return data;24.}25.}上面代码第14行,使用了ArrayAdapter()来装配数据,要装配这些数据就需要连接ListView 视图对象和数组的适配器来适配工作。
临沂大学信息学院学生上机(实验)报告课程名称:Android移动智能开发技术指导教师:学生姓名:学号:一、实验名称ListView下拉列表选项二、实验内容(具体的程序)代码:package com.example.app520;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends Activity {ListView lv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);lv=(ListView) findViewById(R.id.lv);ArrayAdapter<CharSequence>adapter=ArrayAdapter.createFromResource(this, R.array.item, yout.simple_list_item_1);lv.setAdapter(adapter);lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stubStringresult=arg0.getItemAtPosition(arg2).toString();Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.m ain, menu);return true;}}截图:三、实验结果讨论与总结我觉得这种下拉选项,对手机的使用者来说是非常便利的,在使用手机的过程中,就觉得这很神奇,自己做出来感觉特别棒。
listview 方法ListView是Android开发中常用的控件之一,它可以展示一系列的数据,并且支持滚动。
在这篇文章中,我们将会介绍ListView 的一些常用方法。
1. setAdapter(Adapter adapter)这个方法是ListView最为重要的方法之一。
它用于设置ListView的适配器,适配器用来为ListView提供数据源。
2.setOnItemClickListener(AdapterView.OnItemClickListener listener)这个方法用于设置ListView的点击事件监听器。
3.setOnItemLongClickListener(AdapterView.OnItemLongClickListe ner listener)这个方法用于设置ListView的长按事件监听器。
4. setDivider(Drawable divider)这个方法用于设置ListView的分割线,分割线可以是一个Drawable对象。
5. setDividerHeight(int height)这个方法用于设置ListView的分割线的高度。
6. setSelector(Drawable selector)这个方法用于设置ListView的选中项背景,选中项背景可以是一个Drawable对象。
7. smoothScrollToPosition(int position)这个方法可以平滑地将ListView滚动到指定的位置。
8. setChoiceMode(int choiceMode)这个方法用于设置ListView的选择模式,选择模式可以是单选模式或多选模式。
9. getCheckedItemPosition()这个方法返回当前ListView中被选中的项的位置。
10. getFirstVisiblePosition()这个方法返回当前ListView中第一个可见项的位置。
android listactivity焦点控制及运用在Android中,ListActivity是一个实现了ListView的Activity。
它提供了一些特定的方法和功能来控制列表项的焦点以及与列表项的交互。
焦点控制:1. 列表项焦点:ListActivity会自动管理列表项的焦点。
通常情况下,当用户滑动或点击列表时,焦点会自动跟随变化。
可以通过设置列表项的onItemClickListener监听器来处理列表项的点击事件。
2. 列表控件焦点:ListActivity会自动获取ListView的焦点,但也可以通过调用setSelection()方法来设置具体的列表项获得焦点。
运用:1. 数据加载:可以通过实现ListActivity的onCreate()方法来加载数据,并将数据设置到ListAdapter中,然后通过调用setListAdapter()方法将ListAdapter设置给ListActivity。
这将自动将数据显示到列表中。
2. 自定义列表项布局:可以通过创建一个自定义的列表项布局,并实现ListAdapter来控制列表项的数据和展示方式。
然后通过setListAdapter()方法将自定义的ListAdapter设置给ListActivity。
3. 列表项点击事件处理:可以通过实现ListView.OnItemClickListener接口,并通过setOnItemClickListener()方法将点击事件监听器设置给ListView。
在点击事件中可以处理列表项的点击逻辑,如跳转到其他Activity或执行其他操作。
总结:ListActivity提供了简单的焦点控制和功能,可以快速实现一个列表页面,并对列表项的焦点和点击事件进行处理。
可以根据具体需求自定义列表项的布局和表现形式,并处理相应的交互逻辑。
listview addtextchangedlistener -回复标题:深入理解与应用ListView的AddTextChangedListener在Android开发中,ListView是一个非常常用且重要的组件,它主要用于展示一列可滚动的数据项。
而AddTextChangedListener则是用于监听文本变化的一个接口,通常用于EditText等可编辑的文本组件。
那么,如何将这两个元素结合在一起,实现列表视图中的文本变化监听呢?以下是一步一步的详细解析。
首先,我们需要明确ListView和AddTextChangedListener的基本概念。
1. ListView:在Android中,ListView是一种强大的UI组件,它可以显示一个垂直滚动的项目列表。
这些项目可以是任何类型的数据,如字符串、图片或其他自定义的视图。
ListView的核心优点是它可以高效地处理大量的数据,并且只在需要时加载可视的项目,从而提高应用程序的性能。
2. AddTextChangedListener:这是一个接口,主要应用于EditText等可编辑的文本组件。
当用户在EditText中输入或删除文本时,AddTextChangedListener可以监听到这些变化,并触发相应的事件处理方法。
这个接口包含了三个方法:onTextChanged()、beforeTextChanged()和afterTextChanged(),分别在文本变化前后进行回调。
接下来,我们将详细介绍如何在ListView中添加并使用AddTextChangedListener。
步骤一:创建ListView和数据源首先,我们需要在布局文件中创建一个ListView,并在Activity或Fragment中找到这个ListView的实例。
同时,我们需要准备一个数据源,这通常是一个ArrayList或其他集合类,存储了要在ListView中显示的数据项。
listview控件使用的基本流程
1. 简介
ListView是一种常用的Android界面控件,用于显示一系列垂直滚动的列表项。
在Android应用中,我们经常会使用ListView来展示一些数据集合,如联系人列表、新闻列表等。
2. ListView的基本属性
在使用ListView之前,我们首先需要了解它的一些基本属性:
•android:id:ListView的唯一标识符。
•android:layout_width:ListView的宽度属性,可以使用match_parent(填充父容器)或具体数值(如200dp)进行设置。
•android:layout_height:ListView的高度属性,同样可以使用match_parent或具体数值进行设置。
•android:divider:分隔线的样式属性,可以设置为@null表示不显示分隔线,也可以设置为具体颜色的资源ID。
•android:dividerHeight:分隔线的高度属性,可以设置具体数值或wrap_content。
•android:listSelector:列表项被选中时的背景样式属性。
3. 使用ListView的基本步骤
使用ListView控件的基本步骤如下:
1.在XML布局文件中添加ListView控件。
```xml <ListView android:id=。
android listview用法ListView的用法如下:1.在布局文件中声明ListView控件:```某ml<ListView/>```2.在Activity或Fragment中获取ListView实例:```javaListView listView = findViewById(R.id.listview);```3.创建数据源,可以是数组、List或数据库查询结果等:```javaString[] data = {"item1", "item2", "item3"};```4.创建适配器(Adapter),将数据源与ListView关联起来:```javaArrayAdapter<String> adapter = new ArrayAdapter<>(this, yout.simple_list_item_1, data);```5.将适配器设置给ListView:```javalistView.setAdapter(adapter);```6.为ListView设置点击事件监听器:```javalistView.setOnItemClickListener(newAdapterView.OnItemClickListenepublic void onItemClick(AdapterView<?> parent, View view, int position, long id)//处理点击事件}});```以上就是ListView的基本用法。
除了基本的用法,ListView还有以下常用属性和方法:1.添加头部或底部视图:```javaView headerView =LayoutInflater.from(this).inflate(yout.list_header, listView, false);listView.addHeaderView(headerView);View footerView =LayoutInflater.from(this).inflate(yout.list_footer, listView, false);listView.addFooterView(footerView);```2.设置空视图,当数据源为空时显示的视图:```javaView emptyView = findViewById(R.id.empty_view);listView.setEmptyView(emptyView);```3.滚动到指定位置:```javalistView.setSelection(position);```4.滚动到顶部或底部:```javalistView.setSelection(0); // 滚动到顶部listView.setSelection(adapter.getCount( - 1); // 滚动到底部```5.滑动监听器,用于监听ListView的滑动事件:```javalistView.setOnScrollListener(new AbsListView.OnScrollListene public void onScrollStateChanged(AbsListView view, int scrollState)//滑动状态改变时回调}public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 。
AndroidStudio列表⽤法之⼀:ListView图⽂列表显⽰(实例)前⾔:ListView这个列表控件在Android中是最常⽤的控件之⼀,⼏乎在所有的应⽤程序中都会使⽤到它。
⽬前正在做的⼀个记账本APP中就⽤到了它,主要是⽤它来呈现收⽀明细,是⼀个图⽂列表的呈现⽅式,下⾯就讲讲具体是如何实现的。
效果图:该功能是在另⼀篇博⽂【】的基础上进⾏添加的实现的思路:1、该功能是⽤fragment来做布局的,⾸先创建⼀个fragment.xml布局⽂件,在⾥⾯添加⼀个ListView控件;2、由于List⾥⾯既要呈现图⽚,也要呈现⽂字,所以再创建⼀个fragment_item.xml布局⽂件,在⾥⾯添加ImageView、TextView,⽤来显⽰图⽚和⽂字;3、使⽤SimpleAdapter来绑定数据;具体实现逻辑:1、创建fragment_one.xml1 <ListView2 android:id="@+id/lv_expense"3 android:layout_width="match_parent"4 android:layout_height="wrap_content">56 </ListView>2、创建fragment_one_item.xml1 <ImageView2 android:id="@+id/image_expense"3 android:layout_width="wrap_content"4 android:layout_height="wrap_content"5 android:paddingTop="10dp"6 android:paddingRight="10dp"7 android:paddingBottom="10dp"8 android:adjustViewBounds="true"9 android:maxWidth="72dp"10 android:maxHeight="72dp"/>11 <TextView12 android:id="@+id/tv_expense_category"13 android:layout_width="wrap_content"14 android:layout_height="wrap_content"15 android:layout_weight="1"16 android:padding="10dp"/>17 <TextView18 android:id="@+id/tv_expense_money"19 android:layout_width="wrap_content"20 android:layout_height="wrap_content"21 android:text="10.0000"/>3、主逻辑OneFragment.java1 List<Map<String, Object>> listitem = new ArrayList<Map<String, Object>>(); //存储数据的数组列表2//写死的数据,⽤于测试3int[] image_expense = new int[]{R.mipmap.detail_income, R.mipmap.detail_payout }; //存储图⽚4 String[] expense_category = new String[] {"发⼯资", "买⾐服"};5 String[] expense_money = new String[] {"30000.00", "1500.00"};6for (int i = 0; i < image_expense.length; i++)7 {8 Map<String, Object> map = new HashMap<String, Object>();9 map.put("image_expense", image_expense[i]);10 map.put("expense_category", expense_category[i]);11 map.put("expense_money", expense_money[i]);12 listitem.add(map);13 }1415//创建适配器16// 第⼀个参数是上下⽂对象17// 第⼆个是listitem18// 第三个是指定每个列表项的布局⽂件19// 第四个是指定Map对象中定义的两个键(这⾥通过字符串数组来指定)20// 第五个是⽤于指定在布局⽂件中定义的id(也是⽤数组来指定)21 SimpleAdapter adapter = new SimpleAdapter(getActivity()22 , listitem23 , yout.fragment_one_item24 , new String[]{"expense_category", "expense_money", "image_expense"}25 , new int[]{_expense_category, _expense_money, R.id.image_expense});2627 ListView listView = (ListView) v.findViewById(R.id.lv_expense);28 listView.setAdapter(adapter);以上就是整个功能实现的逻辑,本⽂代码中,List中呈现的数据是写死的,从数据库中获取源数据的⽅式可以参考我的源代码,且使⽤的数据库是SQLite。
Android ListView保持选中项高亮项目中需要列表中选中的项保持高亮,在网上搜了一下,大部分文章提到的都是下面这种方法:借助Listview的Tag属性.OnItemClickListener listviewMemuOnItemClickListener = new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {if (((ListView) parent).getTag() != null) {((View) ((ListView) parent).getTag()).setBackgroundDrawable(null);}((ListView) parent).setTag(view);view.setBackgroundResource(R.drawable.listitem_bk);}});最初的出处没有去追踪......试了一下确实可以达到目的,但是似乎有个Bug:当列表中内容比较多,然后在界面向下滚动“翻页”时会发现每页都一项被高亮了,可能和tag有关。
这里提供另一种保持高亮的方法:在包含ListView的布局文件中加入一个空的LinearLayout,以我的main.xml为例:<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:focusableInTouchMode="true"></LinearLayout><ListView android:id="@+id/listView" android:layout_width="fill_parent"android:layout_height="wrap_content"></ListView></LinearLayout>然后在onItemClick中加入listView.clearFocus();listView.requestFocusFromTouch();其中listView是你用findViewById获得的ListView这样就可以了,具体原理未知。
Android中使⽤ListView实现漂亮的表格效果在这⾥我们要使⽤Android ListView来实现显⽰股票⾏情,效果图如下,红⾊表⽰股票价格上涨,绿⾊表⽰股票价格下跌。
第⼀步、定义color.xml如下:复制代码代码如下:<?xml version="1.0" encoding="utf-8"?><resources><color name="color_dark_grey">#808080</color><color name="color_black">#000000</color><color name="color_green">#00FF00</color><color name="color_red">#FF0000</color><color name="color_white">#FFFFFF</color></resources>第⼆步、定义style.xml⽂件如下:复制代码代码如下:<?xml version="1.0" encoding="utf-8"?><resources><!-- Define the list items style begin --><style name="list_item_seperator_layout"><item name="android:layout_width">fill_parent</item><item name="android:layout_height">1dip</item><item name="android:background">@color/color_dark_grey</item></style><style name="list_item_cell_seperator_layout"><item name="android:layout_width">1dip</item><item name="android:layout_height">fill_parent</item><item name="android:background">@color/color_dark_grey</item></style><!-- Define the list items style end --></resources>第三步、定义ListHeader的layout⽂件,stock_list_header.xml如下:复制代码代码如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"><TableLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:stretchColumns="3"><TableRowandroid:id="@+id/stock_list_header_row"><Viewstyle="@style/list_item_cell_seperator_layout"/><TextViewandroid:id="@+id/stock_list_header_code"android:text="@string/stock_code"android:layout_width="60dip"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="2dip"/><Viewstyle="@style/list_item_cell_seperator_layout"/><TextViewandroid:id="@+id/stock_list_header_symbol"android:text="@string/stock_symbol"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="2dip"/><Viewstyle="@style/list_item_cell_seperator_layout"/><TextViewandroid:id="@+id/stock_list_header_last_price"android:text="@string/stock_last_price"android:layout_width="60dip"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="2dip"/><Viewstyle="@style/list_item_cell_seperator_layout"/><TextViewandroid:id="@+id/stock_list_header_price_change"android:text="@string/stock_price_change"android:layout_width="50dip"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="2dip"/><Viewstyle="@style/list_item_cell_seperator_layout"/><TextViewandroid:id="@+id/stock_list_header_price_change_percentage"android:text="@string/stock_price_change_percent"android:layout_width="50dip"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="2dip"/><Viewstyle="@style/list_item_cell_seperator_layout"/></TableRow></TableLayout></LinearLayout><View style="@style/list_item_cell_seperator_layout"/>是⽤来在每个单元格之间显⽰出⼀条垂直的分割线,使单元格之间相互分割开来。
海文国际
Android之ListView
一、列表(ListView)
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
二、列表(ListView)的显示需要三个元素
1.ListView 用来展示列表的View。
2.适配器用来把数据映射到ListView上的中介。
3.数据具体的将被映射的字符串,图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter可以认为是SimpleAdapter 对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
ListView lstView;
三、ListView事件
setOnItemClickListener(点击触摸屏有效)当项被点击后触发
setOnItemSelectListener(点击手机键盘有效,4.*后点击也有效)
ListView lstCourse;
四、ListView提升效率
由于展示空间有限,即使有多个item,界面上只能展示有限的个数,这个时候只
海文国际 需要把有限个View展示在界面上就可以了.
最上方划出的View被接下来的进入界面的最下面的View重复利用的话,就可以大幅度的减少创建View的次数,这样效率得到了提升.
getView方法我们是实现者,android的ListView是调用者,ListView会为我们传入convertView的值.
当有可以重复利用的View时候,convertView为这个View的值,否则为null.
通过持有者模式优化布局,进行动态加载(使用到ConvertView)
在convertView中保存持有者对象,convertView.setTag(wrapper)
再从缓存中获取持有者对象wrapper = (ViewWrapper)convertView.getTag()
建立持有者类ViewWrapper(自定义,主要进行所有视图控件的存放),产生对象wrapper
海文国际
五、ListActivity
当Activity只涉及到一个列表,那么应该考虑将Activity创建成为ListActivity 的子类,而不是以Activity为基类.
当你想自定义布局时候,只需要把ListView标示为@android:id/list,ListActivity 就知道哪个部件是这个活动的主列表.
海文国际。