ListView的优化和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/seaker_/article/details/52882755

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参数
@Override
protected 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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/seaker_/article/details/52882755