ListView的优化和使用

来源:互联网 发布:网络套餐对比 编辑:程序博客网 时间:2024/05/22 12:12

1.使用viewHolder提高ListView的效率

避免的每次去调用getView()方法的时候都要去findViewById()实例控件,利用ViewHolder可以提高50%的效率;`public final class ViewHolder{    public TextView tv;    public ImageView iv;    public EditText et;}`

2.ListView的使用

(1)ListView每个itme之间的分隔线,系统提供了divider和dividerHeight两个属性

divider:可以是一个颜色也可以是一个资源文件

dividerHeight:设置分隔线的高度

如果不想要分隔线就可以设置为android:divider=“@null”

(2)ListView隐藏滚动条:把scrollbars设置为none

(3)取消ListView的点击效果:listSelector:#00000000或者是用android系统自带的一个透明颜色listselector:android:color/transparent

(4)设置显示到ListView的第几个itme,默认是在第一个;listview.setSelection(n)(这是瞬间到达第n个itme);也可以通过下面的代码平滑的到达;

mListView.smoothScrollby(distance,duration);

mListView.smoothScrollbyOffset(offset);

mListView.smoothScrollToosition(index);

(5)动态的修改listView,通过修改List数据来改变listView,但是要保证是修改了同一个list数据,mAdapter.notifyDateSetChanged();

(6)listView的滑动和滚动

mListView.setOnTouchListener(new OnTouchListener() {        @Override        public boolean onTouch(View v, MotionEvent event) {            switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:// 触摸                break;            case MotionEvent.ACTION_MOVE:// 移动                break;            case MotionEvent.ACTION_UP:// 抬起                break;            }            return false;        }    });    // 滑动Listview    mListView.setOnScrollListener(new OnScrollListener() {        @Override        public void onScrollStateChanged(AbsListView view, int scrollState) {            switch (scrollState) {            case OnScrollListener.SCROLL_STATE_FLING:// 手指抛动                break;            case OnScrollListener.SCROLL_STATE_IDLE:// 停止滑动                break;            case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 手指滚动                break;            default:                break;            }        }        @Override        public void onScroll(AbsListView view, int firstVisibleItem,                int visibleItemCount, int totalItemCount) {        //滚动时会一直调用        }    });

(7)具有弹性的listView

//MaxOverScrollY参数默认是0, 只需要把此参数修改为大于0的参数即可。int mMaxOverScrollY = 100;//重写overScrollBy方法 改变MaxOverScrollY参数@Overrideprotected boolean overScrollBy(int deltaX, int deltaY, int scrollX,        int scrollY, int scrollRangeX, int scrollRangeY,        int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {    // TODO Auto-generated method stub    return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,            scrollRangeY, maxOverScrollX, mMaxOverScrollY, isTouchEvent);}private void initView(){//根据手机的分辨率动态的去修改这个参数的大小    DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();    float density = metrics.density;    mMaxOverScrollY = (int) (density * mMaxOverScrollY);}

(8)多种itme类型的Listview

//adapter中添加两个方法:@Override    public int getViewTypeCount() {        //返回item的种类数        return 2;    }@Override    public int getItemViewType(int position) {        //返回itme的具体类型        return mDate.get(position).type;    }//在getView方法中根据不同的type返回不同的convertView        @Override    public View getView(int position, View convertView, ViewGroup parent) {        Holder holder = null;        if (convertView == null) {            if (getItemViewType(position) == 0) {                holder = new Holder();                convertView = View.inflate(MainActivity.this,                        R.layout.main_item, null);                holder.city = (TextView) convertView                        .findViewById(R.id.tv_item_city);                holder.weather = (TextView) convertView                        .findViewById(R.id.tv_item_weather);            } else {                holder = new Holder();                convertView = View.inflate(MainActivity.this,                        R.layout.main_item_2, null);                holder.city = (TextView) convertView                        .findViewById(R.id.tv_item_city_2);                holder.weather = (TextView) convertView                        .findViewById(R.id.tv_item_weather_2);            }            convertView.setTag(holder);        } else {            holder = (Holder) convertView.getTag();        }        Bean bean = mDate.get(position);        holder.city.setText(bean.city);        holder.weather.setText(bean.weather);        return convertView;    }

(9)动态的改变listView的布局,点击某个itme来达到一个Focus的效果

mListView.setOnItemClickListener(new OnItemClickListener() {        @Override        public void onItemClick(AdapterView<?> parent, View view,                int position, long id) {            System.out.println("点击了第"+position+"个条目");            mMainAdapter.setCurrentItem(position);            mMainAdapter.notifyDataSetChanged();        }    });clsee MyAdapter extends BaseAdapter{    private int mCurrentItem;//点击的条目    private boolean isFaist = false;//是否为第一次加载    //第几个条目被点击    public void setCurrentItem(int position) {        mCurrentItem = position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {    //根据点击的条目的位置来分别返回不同的convertview        if (mCurrentItem == position && isFaist) {            return View1;        }else{            isFaist = true;            return View2;        }    }}
0 0
原创粉丝点击