android ListView各种效果实现总结,持续更新...
一、ListView圆角:重写ListView的onInterceptTouchEvent方法,通过pointToPosition(x,y)方法判断当前点击位置所对应的项,有三种情况:分别是第一项、最后一项、中间项;其实第一种情况又分为两种情况:列表总共只有一项和列表不止一项;参照下边的代码即可理解;
复制代码
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
int x = (int) ev.getX();
int y = (int) ev.getY();
int itemnum = pointToPosition(x, y);
if (itemnum == AdapterView.INVALID_POSITION)
break;
else{
if(itemnum==0){ // 选择项为1
if(itemnum==(getAdapter().getCount()-1)){// 列表只有一项
setSelector(R.drawable.app_list_corner_round);
}else{ // 列表不止一项
setSelector(R.drawable.app_list_corner_round_top);
}
}else if(itemnum==(getAdapter().getCount()-1)) // 选择项为最后一项
setSelector(R.drawable.app_list_corner_round_bottom);
else{
setSelector(R.drawable.app_list_corner_shape);
}
}
break;
case MotionEvent.ACTION_UP:
break;
}
复制代码
二、选中项高亮显示,实现ListView选中项高亮显示有两种方法;
1、查看ListView的方法setSelection(int index),看样子好像是,但实际试了之后以现不行,既然不行,那就用一个比较笨的方法:自定义adapter,在adapter的getView方法里面设置背景;然后在ListView的onItemClick回调中向adapter传入点击的项,即可设置选中项高亮状态;
复制代码
public void setSelectedposition(int selectedposition) {
this.selectedposition = selectedposition;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = inflater.inflate(R.layout.item, null);
if (selectedposition == position) {
v.setBackgroundColor(Color.parseColor("#36adcf"));
} else {
v.setBackgroundColor(Color.TRANSPARENT);
}
return v;
}
复制代码
2、有没有更简单的方法?第一种方法看着觉得有点怪怪的,有点歪门邪道的感觉;另一种的方法是通过selector方法实现;定义一个drawable文件,里面包含一个选择状态:state_activated,然后将这个drawable指定为ListView的item的背景;关于这个状态具体含意不再多说,参见官方api;
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/adcf" android:state_activated="true"></item>
<item android:drawable="@android:color/transparent"/>
</selector>
下面是在代码中的实现(部分代码):
listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
getListView().setItemChecked(position, true);
}
注:上面的方法是ListActivity的方法,此方法对应OnItemClickListener接口中的方法;
三、ListView列表项延迟加载
我们都知道当ListView上面滚动时,会执行adapter的getView方法,但问题出来了,有时候为了节约资源及解决效率问题,并不需要滚动到某一项就开始加载数据,而是希望滚动停止,或者说滚动速度低于某一个值时才获取数据,下面讨论的就是这种情况下的处理:
1、为ListView添加OnScrollListener滚动监听器,此监听器可以获取当前滚动状态及可视条目;
复制代码
public int first = 0; // 第一条可视项目
public int visi = 0; // 可视条目总数
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
first = firstVisibleItem;
visi = visibleItemCount;
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE: // 滚动完成
mBusy = false;
int first = view.getFirstVisiblePosition();
for (int i = 0; i < visi; i++) { // 设置所有可视条目Tag为null,条目将会自动加载数据
TextView t = (TextView) view.getChildAt(i);
if (t.getTag() != null) {
t.setText(mStrings[first + i]);
t.setTag(null);
}
}break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 正在滚动(手指未离开屏幕)
mBusy = true;
break;
case OnScrollListener.SCROLL_STATE_FLING: // 正在滚动(手指已离开屏幕)
mBusy = true;
break;
}
}
复制代码
在Adapter中根据mBusy状态,判断是否立即加载数据,重写getView方法;
复制代码
public View getView(int position, View convertView, ViewGroup parent) {
TextView text;
if (convertView == null) {
text = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
} else {
text = (TextView) convertView;
}
if (!mBusy) {
text.setText(mStrings[position]);
// Tag为空代表当前View的数据已经加载完成
text.setTag(null);
} else {
text.setText("Loading...");
// 非空的View代表当前View仍然需要加载更多的数据
text.setTag("cc");
}
return text;
}
}
复制代码
四、类似聊天记录,自动将新添加的项从底部添加并显示到可见区域,主要是两个属性的设置,如下:
复制代码
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:stackFromBottom="true" 自动显示到列表最底部
android:transcriptMode="normal" /> 设置当显示大量的条目时,希望将最新的item显示到可见区域
复制代码
顺便记录一下输入框点击Enter事件,OnKeyListener(参照下面的代码,可实现输入新消息按下Enter并将新消息添加到列表底部);
复制代码
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
// TODO
return true;
}
}
return false;
}
复制代码
五、设置部分条目不可用:通常情况下,一个列表中的所有条目都可以使用,也即可以响应点击事件和有点击的效果,但有的情况下,并不希望所有的条目都这样,就可以自定义Adapter,通过条目的相关属性判断是否可用,(disEnabled状态下,默认的分割条不显示)
复制代码
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
// TODO 通过一定的判断条件设置position条目可用
}
复制代码
六、ListView点击条目展开条目显示更多信息:这种情况也是比较常见的,最多见的应该是评论,一个评论列表,不同的人,评论的内容长度不同,如果全部显示完,就会显示得参差不齐,但又不能只显示了部分,此时就得添加点击条目查看更多的功能了;
简单说下思路:自定义一个View,继承自FrameLayout,里面有两个TextView,一个是单行的(singleLine),另外一个是多行的(wrap_content);公开一个方法设置多行的TextView的可见状态为VISIBLE或者GONE,在ListView的ItemClick回调中设置当列表条目未展开时,点击条目展开条目,也即显示更多信息;当列表是展开的,点击收起条目;并且通知数据源改变:notifyDataSetChanged;
七、在二中说了选中单项的高亮显示,现在来看看多选的高亮显示,同样,多选我这里也知道两种方法;
1、同二中第2种方法,定义一个selector,里面包含一个选择状态state_activited,将此drawable设置为ListView的selector或者是直接设置为条目的背景;此种模式类似于4.0之后部分手机短信列表的长按之后进行选择条目然后进行操作删除的效果;
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); // 设置选择模式
lv.setMultiChoiceModeListener(new ModeCallback());
复制代码
private class ModeCallback implements ListView.MultiChoiceModeListener {
public boolean onCreateActionMode(ActionMode mode, Menu menu) { // 在ActionBar上创建按钮
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.list_select_menu, menu);
mode.setTitle("Select Items");
return true;
}
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
// TODO 点击某一个按钮的回调
}
return true;
}
public void onDestroyActionMode(ActionMode mode) {
}
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) { // 选择项改变回调事件,通过此方法获取选择了哪些项
final int checkedCount = getListView().getCheckedItemCount();
}
}
}
复制代码
2、第二种方法比较简单些,适用范围更加广泛,上一种方法在2.x的版本上运行会出错,因为MultiChoiceMode是高版本上的新的一个接口;对于低版本的手机,下面这种方法更加适用(Item的背景或者selector同上);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
如果需要获取此种方法的选择项,就需要在OnItemClickListener的回调方法中进行判断,即每点击一项,改变当前checked的值,最后再获取结果;
闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛銈呭閺屾盯顢曢敐鍡欙紭闂侀€炲苯鍘搁柣鎺炲閹广垹鈹戠€n亞顦板銈嗘尵婵厼危閸楃偐鏀介柣鎰摠缂嶆垿鏌涘顒夊剰瀹€锝呯仢閳诲酣骞嬪┑鎰棥闂備胶顫嬮崟鍨暦闂佹娊鏀遍崹鍫曞Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戭槮妞わ富鍨堕、姘额敇閻樻彃鐏婃繝鐢靛У閼归箖宕橀埀顒€顪冮妶鍡樺暗闁哥姵鎹囧畷銏ゅ箹娴e厜鎷洪梺纭呭亹閸嬫盯宕濆Δ鍛厸闁告侗鍠氶‖濂告煃椤忓懏灏︽慨濠勭帛閹峰懘宕ㄩ棃娑氱Ш妞ゃ垺鐗犲畷鍗炩槈濡⒈鍞堕梻浣哥秺濡法绮堟笟鈧幃锟犲灳閹颁胶鍞甸柣鐘烘鐏忋劑宕濋悢鍏肩厸闁糕槅鍘鹃悾鐢告煛鐏炲墽娲村┑锛勫厴婵偓闁斥晛鍟拌ぐ鍥⒒娴h櫣甯涚紒瀣箻瀹曟洖鐣烽崶顭戞綗闂佽宕橀褏澹曢崗鑲╃闁糕剝锚娣囶垶鏌涢悙鑼Ш婵﹥妞介弻鍛存倷閼艰泛顏繝鈷€灞芥珝闁哄本鐩幃銏ゆ煥鐎n亙娣俊鐐€戦崹鍝勎涢崘顔衡偓浣割潨閳ь剟骞冮埡鍜佹晝妞ゎ偒鍘奸ˉ姘舵⒑閼姐倕鏋戦柣鐔村劤閳ь剚鍑归崢鍓у垝閸儱绀冩い蹇撴閿涙粓鏌i悩鍙夌┛閻忓繑鐟﹂弲鍫曟晜缁涘顔旈梺缁樺姈瑜板啴寮抽敐澶嬬厱闁冲搫顑囩弧鈧悗瑙勬磸閸旀垿銆佸☉姗嗘僵妞ゆ帒鍊搁杈ㄧ節绾板纾块柛瀣灴瀹曟劙寮介鐐殿唶闂佺粯鍔﹂崜姘跺矗韫囨稒鐓i煫鍥风到娴滅偞銇勯埡鍌滃弨闁哄本娲濈粻娑㈠即閻愭劖鐩弻锟犲焵椤掍胶顩烽悗锝庡亞閸樹粙姊洪悷鎵憼缂佽鍟蹇撯攽鐎n偆鍘遍梺鍦劋閺屻劑銆傞懖鈺冪<缂備焦岣垮ú瀵糕偓娈垮枛閻栧ジ鐛€n亖鏀介柟閭︿簽绾炬儳鈹戞幊閸婃鎱ㄩ悜钘夌;婵炴垶纰嶅畷鍙夋叏濡炶浜鹃悗娈垮櫘閸嬪﹪鐛Ο鑲╃<婵☆垳绮鐔兼⒒娴h姤纭堕柛锝忕畵楠炲繘鏁撻敓锟�/QQ 1602007闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛濠傛健閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鍓у垝椤撶偐妲堟俊顖濐嚙濞呇囨⒑濞茶骞楅柣鐔叉櫊瀵鎮㈤崨濠勭Ф婵°倧绲介崯顖烆敁瀹ュ鈷戦柟鑲╁仜閳ь剚鐗犲畷婵嬪冀椤撶倣锕傛煕閺囥劌鐏犻柛鎰ㄥ亾婵$偑鍊栭崝锕€顭块埀顒傜磼椤旇偐鍩f慨濠傛惈鐓ら悹鍥ㄥ絻缁犲搫顪冮妶鍐ㄥ闁绘鎹囬悰顔藉緞瀹€鈧惌娆愮箾閸℃ê鍔ら柟顔藉灦缁绘繈濮€閿濆棛銆愰梺鎸庢穿缁犳挸鐣烽姀鐘嗘椽顢旈崨顏呭闂備礁鎲$换鍌溾偓姘煎墴瀵啿鈻庨幘瀵稿幗濠德板€愰崑鎾翠繆椤愶絿鎳囩€规洘娲熼、鏇㈡晜鐟欙絾瀚藉┑鐐舵彧缁插潡骞婇幘娲绘晪婵犲﹤鎳愮壕濂告偣閸ャ劌绲婚柍褜鍓欓悘婵嬫偩閻戣棄绠涢柡澶婄仢缁愭稒绻濋悽闈浶㈤悗姘槻鐓ら柟闂寸劍閳锋垿鎮归崶锝傚亾瀹曞洠鍋撴繝姘厓鐟滄粓宕滈悢濂夊殨闁靛⿵濡囬々鐑芥倵閿濆骸浜為柛妯挎閳规垿鍩ラ崱妤冧淮濠电偛顦板ú婊堟嚍闁秴閿ゆ俊銈勮兌閸橀亶妫呴銏″闁规瓕顕ч敃銏″鐎涙ḿ鍘梺鎼炲劀閸愬彞绱旀俊銈囧Х閸嬫稑煤椤撯偓鈧線寮崼婵嗚€垮┑鐐叉閸ㄧ敻鐛崱娑欌拻闁稿本鐟чˇ锕傛煙绾板崬浜伴柟顖氭湰瀵板嫮浠﹂幆褍绨ユ繝鐢靛█濞佳兾涘☉銏犳辈闁挎洖鍊归悡娆撴煟閹寸伝顏堟倶瀹ュ鐓曟い鎰靛亗闁垱顨ラ悙瀵稿ⅹ閼挎劖銇勯幒鍡椾壕闂佽娴氭禍顏堝蓟閿熺姴骞㈡繛鍡楃箣缁爼姊虹€圭媭娼愰柛銊ユ健楠炲啫鈻庤箛锝呮櫊濡炪倖鏌ㄩ崥瀣敊瀹ュ應鏀介柣妯诲墯閸熷繘鏌涢悩鎰佹疁妤犵偞鍔欓獮搴ㄦ寠婢跺瞼鏆柣鐔哥矋濡啴鎮伴鍢夌喖宕楅悡搴e酱闂備浇鍋愰埛鍫ュ礈濞戙垹姹插ù鐓庣摠閳锋帒霉閿濆懏鍟為柛鐔哄仦缁绘稓鎷犺閻g數鈧娲栫紞濠囧蓟閸℃鍚嬮柛娑卞灲缁遍亶姊绘担鍛婂暈婵炶绠撳畷褰掓焼瀹ュ棗浜楅梺鎸庣箓椤﹂亶宕i幘缁樼厱闁靛绲芥俊浠嬫倶韫囧骸宓嗛柟顔肩秺楠炲洭宕滄担铏规闁诲孩顔栭崳顕€宕戞繝鍌滄殾濠靛倻枪鍞梺鎸庢椤鈧俺妫勯埞鎴︽倷鐎涙ê闉嶉梺绯曟櫅閸熸潙鐣烽幋锕€绠婚悗闈涙憸椤旀洘绻涙潏鍓у埌闁哥喎娼″畷銉ノ熺悰鈩冾潔濠碘槅鍨辩划宥呂涢崘銊ф殾妞ゅ繐鎳忔刊鎾偡濞嗗繐顏柣婵囶殜濮婂宕掑▎鎴М闂佽绁撮崜婵堢箔閻旇偤鏃堝川椤撶姷宕舵繝娈垮枟鏋紓鍫滃嵆閸┾偓妞ゆ巻鍋撻柟铏锝嗙節濮橆儵銊╂煥閺冣偓閸庢娊鐛幇鐗堚拻濞达綀顫夐崑鐘绘煕鎼搭喖娅嶇€殿喗褰冮埥澶愬閻樻彃娈ら梻浣告惈閸燁偊鎮ф繝鍥ㄥ亗闁告劦鍠楅悡鐔兼煟閺冨伋褰捤夌€n喖鏋侀柛顐犲劜閳锋垿鏌涘┑鍡楊伂閻庢碍澹嗙槐鎺撳緞鎼搭喗缍堟繛锝呮搐閿曨亪骞冨⿰鍫熷癄濠㈠厜鏂傞崝鎴﹀蓟閺囩喎绶炴繛鎴欏灪椤庡秹姊烘导娆掝吅缂傚秳绶氬濠氭晲婢跺浜滈梺鍛婄缚閸庢娊鎮℃担绯曟斀闁绘﹩鍠栭悘顏堟煥濮樿埖鎳氶柣鎰節缁诲棝鏌曢崼婵囧櫤闁革綀娅g槐鎺楁偐閸愬弶璇炲┑顔硷功缁垶骞忛崨鏉戝窛闂傚牊绋掔拹锟犳煙楠炲灝鐏叉鐐村笒铻栭柍褜鍓熼幃锟犲即閵忥紕鍘卞銈嗗姧缁叉寧淇婇崶顒佺厸閻庯綆鍋呴ˉ鍫ユ煛瀹€瀣瘈鐎规洘锕㈡俊鎼佸Ψ閵忕姳澹曢悷婊呭鐢帞绮eΔ鍛厵闁规鍠栭。濂告煕鐎c劌濡介柕鍥у瀵粙鎮介棃娑樼厒闂備礁鎼鍥窗閺嶎厼绠栨俊銈傚亾妞ゎ偅绻堥幃娆擃敆閳ь剟顢旈敓锟�
>更多相关文章
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 03-08消息称微软开发内部AI推理模型,或将成为Op
- 03-08美国法院驳回马斯克请求,未阻止OpenAI转型
- 03-08饿了么成立即时配送算法专家委员会 持续全局
- 03-08长安汽车:预计今年底长安飞行汽车将完成试
- 03-08谷歌推出虚拟试穿、AR美妆新功能
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御