Android(安卓)UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
POSTED ON2014年6月27日本文内容:
1、横向ListView的所有实现思路;
2、其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册;
3、实现的横向ListView在点击、浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题。
众所周知,ListView默认的方向是垂直的,但有些时候人们更喜欢横向ListView。纵观整个网络,横向ListView的实现思路如下:
1、在布局里用HorizontalScrollView包含一个ListView,参考这里;
2、利用GridView,把它的行数设为1行;
3、有人继承ListView构造了一个HorizontalScrollListView,参见:这里
4、国外一位大牛继承AdapterView<ListAdapter>构造的HorizontalListView,这是以上所有方法里本人认为最正统的方法,本文即基于此方法,参见:这里
下面看源码:
这是Activity的布局文件:activity_main.xml [html] view plain copy print ?- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”><RelativeLayoutxmlns:android=“http://schemas.android.com/apk/res/android”
- xmlns:tools=“http://schemas.android.com/tools”
- android:layout_width=“match_parent”
- android:layout_height=“match_parent”
- android:paddingBottom=“@dimen/activity_vertical_margin”
- android:paddingLeft=“@dimen/activity_horizontal_margin”
- android:paddingRight=“@dimen/activity_horizontal_margin”
- android:paddingTop=“@dimen/activity_vertical_margin”
- tools:context=“.MainActivity”
- >
- <org.yanzi.ui.HorizontalListView
- android:id=“@+id/horizon_listview”
- android:layout_width=“match_parent”
- android:layout_height=“150dip”
- android:layout_alignParentTop=“true”
- >
- </org.yanzi.ui.HorizontalListView>
- <ImageView
- android:id=“@+id/image_preview”
- android:layout_width=“wrap_content”
- android:layout_height=“wrap_content”
- android:layout_below=“@id/horizon_listview”
- android:layout_centerInParent=“true”
- android:clickable=“true”
- android:background=“@drawable/selector_imageview_background”
- />
- <!–android:background=”@android:drawable/ic_menu_gallery”–>
- </RelativeLayout></span>
- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”><?xmlversion=“1.0”encoding=“utf-8″?>
- <LinearLayoutxmlns:android=“http://schemas.android.com/apk/res/android”
- android:layout_width=“wrap_content”
- android:layout_height=“wrap_content”
- android:paddingLeft=“2dip”
- android:paddingRight=“2dip”
- android:paddingTop=“2dip”
- android:paddingBottom=“2dip”
- android:orientation=“vertical”
- android:gravity=“center”
- android:clickable=“true”
- android:background=“@drawable/selector_item_background”>
- <ImageView
- android:id=“@+id/img_list_item”
- android:layout_width=“wrap_content”
- android:layout_height=“wrap_content”/>
- <TextView
- android:id=“@+id/text_list_item”
- android:layout_width=“match_parent”
- android:layout_height=“wrap_content”
- android:gravity=“center”/>
- </LinearLayout>
- </span>
下面文件是selector_imageview_background.xml,这是大图片你点击浏览时背景发生变化的selector,没有啥实际作用。
[html] view plain copy print ?- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”><?xmlversion=“1.0”encoding=“utf-8″?>
- <selectorxmlns:android=“http://schemas.android.com/apk/res/android”>
- <itemandroid:drawable=“@android:color/holo_green_light”android:state_pressed=“true”/>
- <itemandroid:drawable=“@android:color/holo_green_light”android:state_focused=“true”/>
- <itemandroid:drawable=“@drawable/image_background”></item>
- <!–android:drawable=”@android:color/transparent”–>
- </selector></span>
下面是每个item的selector,在focus和select时颜色会发生变化:selector_item_background.xml
[html] view plain copy print ?- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”><?xmlversion=“1.0”encoding=“utf-8″?>
- <selectorxmlns:android=“http://schemas.android.com/apk/res/android”>
- <itemandroid:drawable=“@android:color/holo_red_light”android:state_selected=“true”/>
- <itemandroid:drawable=“@android:color/holo_green_dark”android:state_pressed=“true”/>
- <itemandroid:drawable=“@android:color/transparent”/>
- </selector></span>
主程序:MainActivity.java
[java] view plain copy print ?- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”>packageorg.yanzi.testhorizontallistview;
- importorg.yanzi.ui.HorizontalListView;
- importorg.yanzi.ui.HorizontalListViewAdapter;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.view.Menu;
- importandroid.view.View;
- importandroid.widget.AdapterView;
- importandroid.widget.AdapterView.OnItemClickListener;
- importandroid.widget.ImageView;
- publicclassMainActivityextendsActivity{
- HorizontalListViewhListView;
- HorizontalListViewAdapterhListViewAdapter;
- ImageViewpreviewImg;
- ViewolderSelectView=null;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initUI();
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- }
- publicvoidinitUI(){
- hListView=(HorizontalListView)findViewById(R.id.horizon_listview);
- previewImg=(ImageView)findViewById(R.id.image_preview);
- String[]titles={“怀师”,“南怀瑾军校”,“闭关”,“南怀瑾”,“南公庄严照”,“怀师法相”};
- finalint[]ids={R.drawable.nanhuaijin_miss,R.drawable.nanhuaijin_school,
- R.drawable.nanhuaijin_biguan,R.drawable.nanhuaijin,
- R.drawable.nanhuaijin_zhuangyan,R.drawable.nanhuaijin_faxiang};
- hListViewAdapter=newHorizontalListViewAdapter(getApplicationContext(),titles,ids);
- hListView.setAdapter(hListViewAdapter);
- //hListView.setOnItemSelectedListener(newOnItemSelectedListener(){
- //
- //@Override
- //publicvoidonItemSelected(AdapterView<?>parent,Viewview,
- //intposition,longid){
- ////TODOAuto-generatedmethodstub
- //if(olderSelected!=null){
- //olderSelected.setSelected(false);//上一个选中的View恢复原背景
- //}
- //olderSelected=view;
- //view.setSelected(true);
- //}
- //
- //@Override
- //publicvoidonNothingSelected(AdapterView<?>parent){
- ////TODOAuto-generatedmethodstub
- //
- //}
- //});
- hListView.setOnItemClickListener(newOnItemClickListener(){
- @Override
- publicvoidonItemClick(AdapterView<?>parent,Viewview,
- intposition,longid){
- //TODOAuto-generatedmethodstub
- //if(olderSelectView==null){
- //olderSelectView=view;
- //}else{
- //olderSelectView.setSelected(false);
- //olderSelectView=null;
- //}
- //olderSelectView=view;
- //view.setSelected(true);
- previewImg.setImageResource(ids[position]);
- hListViewAdapter.setSelectIndex(position);
- hListViewAdapter.notifyDataSetChanged();
- }
- });
- }
- }
- </span>
HorizontalListView.java 这就是自定义的横向listview
[java] view plain copy print ?- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”>packageorg.yanzi.ui;
- /*
- *HorizontalListView.javav1.5
- *
- *
- *TheMITLicense
- *Copyright(c)2011PaulSoucy(paul@dev-smart.com)
- *
- *Permissionisherebygranted,freeofcharge,toanypersonobtainingacopy
- *ofthissoftwareandassociateddocumentationfiles(the“Software”),todeal
- *intheSoftwarewithoutrestriction,includingwithoutlimitationtherights
- *touse,copy,modify,merge,publish,distribute,sublicense,and/orsell
- *copiesoftheSoftware,andtopermitpersonstowhomtheSoftwareis
- *furnishedtodoso,subjecttothefollowingconditions:
- *
- *Theabovecopyrightnoticeandthispermissionnoticeshallbeincludedin
- *allcopiesorsubstantialportionsoftheSoftware.
- *
- *THESOFTWAREISPROVIDED“ASIS”,WITHOUTWARRANTYOFANYKIND,EXPRESSOR
- *IMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIESOFMERCHANTABILITY,
- *FITNESSFORAPARTICULARPURPOSEANDNONINFRINGEMENT.INNOEVENTSHALLTHE
- *AUTHORSORCOPYRIGHTHOLDERSBELIABLEFORANYCLAIM,DAMAGESOROTHER
- *LIABILITY,WHETHERINANACTIONOFCONTRACT,TORTOROTHERWISE,ARISINGFROM,
- *OUTOFORINCONNECTIONWITHTHESOFTWAREORTHEUSEOROTHERDEALINGSIN
- *THESOFTWARE.
- *
- */
- importjava.util.LinkedList;
- importjava.util.Queue;
- importandroid.content.Context;
- importandroid.database.DataSetObserver;
- importandroid.graphics.Rect;
- importandroid.util.AttributeSet;
- importandroid.view.GestureDetector;
- importandroid.view.GestureDetector.OnGestureListener;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- importandroid.widget.AdapterView;
- importandroid.widget.ListAdapter;
- importandroid.widget.Scroller;
- publicclassHorizontalListViewextendsAdapterView<ListAdapter>{
- publicbooleanmAlwaysOverrideTouch=true;
- protectedListAdaptermAdapter;
- privateintmLeftViewIndex=-1;
- privateintmRightViewIndex=0;
- protectedintmCurrentX;
- protectedintmNextX;
- privateintmMaxX=Integer.MAX_VALUE;
- privateintmDisplayOffset=0;
- protectedScrollermScroller;
- privateGestureDetectormGesture;
- privateQueue<View>mRemovedViewQueue=newLinkedList<View>();
- privateOnItemSelectedListenermOnItemSelected;
- privateOnItemClickListenermOnItemClicked;
- privateOnItemLongClickListenermOnItemLongClicked;
- privatebooleanmDataChanged=false;
- publicHorizontalListView(Contextcontext,AttributeSetattrs){
- super(context,attrs);
- initView();
- }
- privatesynchronizedvoidinitView(){
- mLeftViewIndex=-1;
- mRightViewIndex=0;
- mDisplayOffset=0;
- mCurrentX=0;
- mNextX=0;
- mMaxX=Integer.MAX_VALUE;
- mScroller=newScroller(getContext());
- mGesture=newGestureDetector(getContext(),mOnGesture);
- }
- @Override
- publicvoidsetOnItemSelectedListener(AdapterView.OnItemSelectedListenerlistener){
- mOnItemSelected=listener;
- }
- @Override
- publicvoidsetOnItemClickListener(AdapterView.OnItemClickListenerlistener){
- mOnItemClicked=listener;
- }
- @Override
- publicvoidsetOnItemLongClickListener(AdapterView.OnItemLongClickListenerlistener){
- mOnItemLongClicked=listener;
- }
- privateDataSetObservermDataObserver=newDataSetObserver(){
- @Override
- publicvoidonChanged(){
- synchronized(HorizontalListView.this){
- mDataChanged=true;
- }
- invalidate();
- requestLayout();
- }
- @Override
- publicvoidonInvalidated(){
- reset();
- invalidate();
- requestLayout();
- }
- };
- @Override
- publicListAdaptergetAdapter(){
- returnmAdapter;
- }
- @Override
- publicViewgetSelectedView(){
- //TODO:implement
- returnnull;
- }
- @Override
- publicvoidsetAdapter(ListAdapteradapter){
- if(mAdapter!=null){
- mAdapter.unregisterDataSetObserver(mDataObserver);
- }
- mAdapter=adapter;
- mAdapter.registerDataSetObserver(mDataObserver);
- reset();
- }
- privatesynchronizedvoidreset(){
- initView();
- removeAllViewsInLayout();
- requestLayout();
- }
- @Override
- publicvoidsetSelection(intposition){
- //TODO:implement
- }
- privatevoidaddAndMeasureChild(finalViewchild,intviewPos){
- LayoutParamsparams=child.getLayoutParams();
- if(params==null){
- params=newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
- }
- addViewInLayout(child,viewPos,params,true);
- child.measure(MeasureSpec.makeMeasureSpec(getWidth(),MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(getHeight(),MeasureSpec.AT_MOST));
- }
- @Override
- protectedsynchronizedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom){
- super.onLayout(changed,left,top,right,bottom);
- if(mAdapter==null){
- return;
- }
- if(mDataChanged){
- intoldCurrentX=mCurrentX;
- initView();
- removeAllViewsInLayout();
- mNextX=oldCurrentX;
- mDataChanged=false;
- }
- if(mScroller.computeScrollOffset()){
- intscrollx=mScroller.getCurrX();
- mNextX=scrollx;
- }
- if(mNextX<=0){
- mNextX=0;
- mScroller.forceFinished(true);
- }
- if(mNextX>=mMaxX){
- mNextX=mMaxX;
- mScroller.forceFinished(true);
- }
- intdx=mCurrentX–mNextX;
- removeNonVisibleItems(dx);
- fillList(dx);
- positionItems(dx);
- mCurrentX=mNextX;
- if(!mScroller.isFinished()){
- post(newRunnable(){
- @Override
- publicvoidrun(){
- requestLayout();
- }
- });
- }
- }
- privatevoidfillList(finalintdx){
- intedge=0;
- Viewchild=getChildAt(getChildCount()-1);
- if(child!=null){
- edge=child.getRight();
- }
- fillListRight(edge,dx);
- edge=0;
- child=getChildAt(0);
- if(child!=null){
- edge=child.getLeft();
- }
- fillListLeft(edge,dx);
- }
- privatevoidfillListRight(intrightEdge,finalintdx){
- while(rightEdge+dx<getWidth()&&mRightViewIndex<mAdapter.getCount()){
- Viewchild=mAdapter.getView(mRightViewIndex,mRemovedViewQueue.poll(),this);
- addAndMeasureChild(child,-1);
- rightEdge+=child.getMeasuredWidth();
- if(mRightViewIndex==mAdapter.getCount()-1){
- mMaxX=mCurrentX+rightEdge–getWidth();
- }
- if(mMaxX<0){
- mMaxX=0;
- }
- mRightViewIndex++;
- }
- }
- privatevoidfillListLeft(intleftEdge,finalintdx){
- while(leftEdge+dx>0&&mLeftViewIndex>=0){
- Viewchild=mAdapter.getView(mLeftViewIndex,mRemovedViewQueue.poll(),this);
- addAndMeasureChild(child,0);
- leftEdge-=child.getMeasuredWidth();
- mLeftViewIndex–;
- mDisplayOffset-=child.getMeasuredWidth();
- }
- }
- privatevoidremoveNonVisibleItems(finalintdx){
- Viewchild=getChildAt(0);
- while(child!=null&&child.getRight()+dx<=0){
- mDisplayOffset+=child.getMeasuredWidth();
- mRemovedViewQueue.offer(child);
- removeViewInLayout(child);
- mLeftViewIndex++;
- child=getChildAt(0);
- }
- child=getChildAt(getChildCount()-1);
- while(child!=null&&child.getLeft()+dx>=getWidth()){
- mRemovedViewQueue.offer(child);
- removeViewInLayout(child);
- mRightViewIndex–;
- child=getChildAt(getChildCount()-1);
- }
- }
- privatevoidpositionItems(finalintdx){
- if(getChildCount()>0){
- mDisplayOffset+=dx;
- intleft=mDisplayOffset;
- for(inti=0;i<getChildCount();i++){
- Viewchild=getChildAt(i);
- intchildWidth=child.getMeasuredWidth();
- child.layout(left,0,left+childWidth,child.getMeasuredHeight());
- left+=childWidth+child.getPaddingRight();
- }
- }
- }
- publicsynchronizedvoidscrollTo(intx){
- mScroller.startScroll(mNextX,0,x–mNextX,0);
- requestLayout();
- }
- @Override
- publicbooleandispatchTouchEvent(MotionEventev){
- booleanhandled=super.dispatchTouchEvent(ev);
- handled|=mGesture.onTouchEvent(ev);
- returnhandled;
- }
- protectedbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,
- floatvelocityY){
- synchronized(HorizontalListView.this){
- mScroller.fling(mNextX,0,(int)-velocityX,0,0,mMaxX,0,0);
- }
- requestLayout();
- returntrue;
- }
- protectedbooleanonDown(MotionEvente){
- mScroller.forceFinished(true);
- returntrue;
- }
- privateOnGestureListenermOnGesture=newGestureDetector.SimpleOnGestureListener(){
- @Override
- publicbooleanonDown(MotionEvente){
- returnHorizontalListView.this.onDown(e);
- }
- @Override
- publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,
- floatvelocityY){
- returnHorizontalListView.this.onFling(e1,e2,velocityX,velocityY);
- }
- @Override
- publicbooleanonScroll(MotionEvente1,MotionEvente2,
- floatdistanceX,floatdistanceY){
- synchronized(HorizontalListView.this){
- mNextX+=(int)distanceX;
- }
- requestLayout();
- returntrue;
- }
- @Override
- publicbooleanonSingleTapConfirmed(MotionEvente){
- for(inti=0;i<getChildCount();i++){
- Viewchild=getChildAt(i);
- if(isEventWithinView(e,child)){
- if(mOnItemClicked!=null){
- mOnItemClicked.onItemClick(HorizontalListView.this,child,mLeftViewIndex+1+i,mAdapter.getItemId(mLeftViewIndex+1+i));
- }
- if(mOnItemSelected!=null){
- mOnItemSelected.onItemSelected(HorizontalListView.this,child,mLeftViewIndex+1+i,mAdapter.getItemId(mLeftViewIndex+1+i));
- }
- break;
- }
- }
- returntrue;
- }
- @Override
- publicvoidonLongPress(MotionEvente){
- intchildCount=getChildCount();
- for(inti=0;i<childCount;i++){
- Viewchild=getChildAt(i);
- if(isEventWithinView(e,child)){
- if(mOnItemLongClicked!=null){
- mOnItemLongClicked.onItemLongClick(HorizontalListView.this,child,mLeftViewIndex+1+i,mAdapter.getItemId(mLeftViewIndex+1+i));
- }
- break;
- }
- }
- }
- privatebooleanisEventWithinView(MotionEvente,Viewchild){
- RectviewRect=newRect();
- int[]childPosition=newint[2];
- child.getLocationOnScreen(childPosition);
- intleft=childPosition[0];
- intright=left+child.getWidth();
- inttop=childPosition[1];
- intbottom=top+child.getHeight();
- viewRect.set(left,top,right,bottom);
- returnviewRect.contains((int)e.getRawX(),(int)e.getRawY());
- }
- };
- }
- </span>
HorizontalListViewAdapter.java 横向listview的适配器,我将他单独写到一个java文件里。
[java] view plain copy print ?- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”>packageorg.yanzi.ui;
- importorg.yanzi.testhorizontallistview.R;
- importorg.yanzi.util.BitmapUtil;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.drawable.Drawable;
- importandroid.media.ThumbnailUtils;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.ImageView;
- importandroid.widget.TextView;
- publicclassHorizontalListViewAdapterextendsBaseAdapter{
- privateint[]mIconIDs;
- privateString[]mTitles;
- privateContextmContext;
- privateLayoutInflatermInflater;
- BitmapiconBitmap;
- privateintselectIndex=-1;
- publicHorizontalListViewAdapter(Contextcontext,String[]titles,int[]ids){
- this.mContext=context;
- this.mIconIDs=ids;
- this.mTitles=titles;
- mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//LayoutInflater.from(mContext);
- }
- @Override
- publicintgetCount(){
- returnmIconIDs.length;
- }
- @Override
- publicObjectgetItem(intposition){
- returnposition;
- }
- @Override
- publiclonggetItemId(intposition){
- returnposition;
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- ViewHolderholder;
- if(convertView==null){
- holder=newViewHolder();
- convertView=mInflater.inflate(R.layout.horizontal_list_item,null);
- holder.mImage=(ImageView)convertView.findViewById(R.id.img_list_item);
- holder.mTitle=(TextView)convertView.findViewById(R.id.text_list_item);
- convertView.setTag(holder);
- }else{
- holder=(ViewHolder)convertView.getTag();
- }
- if(position==selectIndex){
- convertView.setSelected(true);
- }else{
- convertView.setSelected(false);
- }
- holder.mTitle.setText(mTitles[position]);
- iconBitmap=getPropThumnail(mIconIDs[position]);
- holder.mImage.setImageBitmap(iconBitmap);
- returnconvertView;
- }
- privatestaticclassViewHolder{
- privateTextViewmTitle;
- privateImageViewmImage;
- }
- privateBitmapgetPropThumnail(intid){
- Drawabled=mContext.getResources().getDrawable(id);
- Bitmapb=BitmapUtil.drawableToBitmap(d);
- //Bitmapbb=BitmapUtil.getRoundedCornerBitmap(b,100);
- intw=mContext.getResources().getDimensionPixelOffset(R.dimen.thumnail_default_width);
- inth=mContext.getResources().getDimensionPixelSize(R.dimen.thumnail_default_height);
- BitmapthumBitmap=ThumbnailUtils.extractThumbnail(b,w,h);
- returnthumBitmap;
- }
- publicvoidsetSelectIndex(inti){
- selectIndex=i;
- }
- }</span>
下面是效果图:
下图是一个item被选定后,另一个item获得了焦点: 下面是横向时的截图:要点如下:
1、可以说这个HorizontalListView是完美的,但美中不足的并不是其他人说的不能点击、晃动、加载不全的问题,而是这个横向Listview的高度,如果你设成wrap_cotent那么将会占据整个屏幕, 即使你将它适配器里的view的高度限制死,限制成很小,这个HorizontalListView的高度依然是全屏。本文代码里,我把图片缩略图弄成100dip,所以把这个HorizontalListView的高度设为了150dip。 2、在适配器里,我填充了一个图片,下面是文字。为了能让浏览图片时item有反应,搞了一个selector,它的用法详见 这里. 但一开始在点击时完全没有反应,参考这里: http://blog.csdn.net/ljz2009y/article/details/18820071 为此我的selector如下: <?xml version=”1.0″ encoding=”utf-8″?><selector xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:drawable=”@android:color/holo_red_light” android:state_selected=”true”/>
<item android:drawable=”@android:color/holo_green_dark” android:state_pressed=”true”/>
<item android:drawable=”@android:color/transparent”/>
</selector> 将自然状态下的背景放到了最后,但点击浏览时依然没有作用。 其实最根本原因是在布局文件里horizontal_list_item.xml要让这个布局能够clickable,即:android:clickable=”true” 3、上一步完成了,还需要点击即select一个item时,让它变色并且保持住,然后点击另外一个item时,让之前得item恢复默认背景。为了实现这个问题,我曾作如下尝试: [java] view plain copy print ?
- <spanstyle=“font-family:‘ComicSansMS';font-size:18px;”>//if(olderSelectView==null){
- //olderSelectView=view;
- //}else{
- //olderSelectView.setSelected(false);
- //olderSelectView=null;
- //}
- //olderSelectView=view;
- //view.setSelected(true);</span>
即在click监听里,保存上一个选中的view。遗憾的是这种方法会造成item的选中状态造成混乱,比如第一个item选中了,同时第5个item也莫名其妙的被选中了。上述情况发生在滑动时,即一屏显示不完的情况下。当我横屏时,在所有的item都能一次性显示出来情况下,用上述方法么问题。后来我想到,这可以是适配器里的缓存机制造成的,最好不要再listview适配器外对item作修改,即便修改则一定要调适配器的: hListViewAdapter.notifyDataSetChanged();通知刷新view,毕竟适配器才是view的提供者。参考这位大大的文章:http://longyi-java.iteye.com/blog/976067在适配器里加了一个接口保存选中的索引,然后再getView函数里进行判断。如果是选中的item,则将布局设为选中状态即可,horizontal_list_item.xml里的Linearlayout就会自动加载那个selector了。而无需像这个参考链接里对每个item的元素分别设置状态。
4、BitmapUtil是个工具类,负责将id转成一个bitmap,然后用android自带的ThumbnailUtils去提取缩略图。 5、之所以horizontal_list_item布局里要设置padding是为了选中item时,整个item有种被圈住的感觉,而不是光下面一点变色。源码下载:http://download.csdn.net/detail/yanzi1225627/7046295
更多相关文章
- Android中如何取消listview的点击效果
- Android(安卓)开发ListView适配器优化
- ListView中显示圆形图像
- Android常用UI组件 - ListView
- Android中的RecyclerView的使用(一)
- java/android 设计模式学习笔记(6)---适配器模式
- Android(安卓)学习
- Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动
- Android新手入门2016(8)--ListView之ArrayAdapter