您的位置:首页 > 其它

ListView的使用

2016-07-26 19:32 549 查看
ListView的优化可以使用ViewHolder模式来提高效率。

ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候

都去通过findViewById()实例化控件。代码如下:

//主页面

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns: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:orientation="vertical"

    tools:context="com.shuaijie.jiang.mytest.MainActivity">

    <ListView

        android:id="@+id/lv"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:divider="@android:color/darker_gray"

        android:dividerHeight="10dp"></ListView>

</LinearLayout>

//item布局文件

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:gravity="center_vertical"

    android:orientation="horizontal">

    <ImageView

        android:id="@+id/iv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

    <TextView

        android:id="@+id/tv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

</LinearLayout>

//ViewHolderAdapter代码

public class ViewHolderAdapter extends BaseAdapter {

    private List<String> mData;

    private LayoutInflater mInflater;

    public ViewHolderAdapter(Context context, List<String> data) {

        this.mData = data;

        mInflater = LayoutInflater.from(context);

    }

    @Override

    public int getCount() {

        return mData.size();

    }

    @Override

    public Object getItem(int i) {

        return mData.get(i);

    }

    @Override

    public long getItemId(int i) {

        return i;

    }

    @Override

    public View getView(int i, View view, ViewGroup viewGroup) {

        ViewHolder holder = null;

        //判断是否缓存

        if (view == null) {

            holder = new ViewHolder();

            //通过LayoutInflater实例化布局

            view = mInflater.inflate(R.layout.viewholder_item, null);

            holder.img = (ImageView) view.findViewById(R.id.iv);

            holder.title = (TextView) view.findViewById(R.id.tv);

            view.setTag(holder);

        } else {

            holder = (ViewHolder) view.getTag();

        }

        holder.img.setBackgroundResource(R.mipmap.ic_launcher);

        holder.title.setText(mData.get(i));

        return view;

    }

    public final class ViewHolder {

        public ImageView img;

        public TextView title;

    }

}

//主Activity代码

public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.lv);

        List<String> list = new ArrayList<String>();

        for (int i = 0; i < 50; i++) {

            list.add(i + "");

        }

        lv.setAdapter(new ViewHolderAdapter(this, list));

    }

}

你可以通过ListView的两个属性android:divider和android:dividerHeight来设置项目间

分隔线。

如果你想隐藏ListView的滚动条可以使用ListView的android:scrollbars="none"来设置。

如果你想取消ListView的item点击效果,可以使用属性android:listSelector="#00000000"。

ListView默认显示在第一个item,当需要指定具体显示的Item时,可以在代码中设置,

listView.setSelection(n);n代表显示第几个item。

当ListView中的数据发生改变时,可以使用adapter.notifyDataSetChanged();方法来改变。但是有

一个前提是传给Adapter的数据list是同一个list不能是其他对象。只需要给修改list然后通知adapter修改即可。

当ListView没有列表数据时,ListView提供一个方法给予默认提示。

listView.setEmptyView(findViewById(id));id为空数据时要显示的布局。

//布局如下:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns: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"

    tools:context="com.shuaijie.jiang.mytest.MainActivity">

    <ListView

        android:id="@+id/lv"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:divider="@android:color/darker_gray"

        android:dividerHeight="10dp"></ListView>

    <ImageView

        android:id="@+id/img"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@mipmap/ic_launcher" />

</FrameLayout>

ListView的两种监听滑动事件的方法:

listView.setOnTouchListener(new View.OnTouchListener() {

            @Override

            public boolean onTouch(View view, MotionEvent motionEvent) {

                switch (motionEvent.getAction()) {

                    case MotionEvent.ACTION_DOWN:

                        //触摸时操作

                        break;

                    case MotionEvent.ACTION_MOVE:

                        //移动时操作

                        break;

                    case MotionEvent.ACTION_UP:

                        //离开时操作

                        break;

                }

                return false;

            }

        });

listView.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override

            public void onScrollStateChanged(AbsListView absListView, int i) {

                switch (i){

                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:

                        //滑动停止时

                        break;

                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:

                        //正在滚动

                        break;

                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:

                        //手指离开ListView后,ListView由于惯性继续滑动

                        break;

                }

            }

            @Override

            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

                //滚动时一直调用

        //firstVisibleItem当前你能看见的第一个Item的ID(从0开始)

        //visibleItemCount当前能看见的Item总数(包括没有显示完整的Item,即显示一小半的Item也包括在内了)

        //totalItemCount整个ListView的Item总数

                if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){

            //滚动到最后一行

        }        

        //判断滚动的方向

        if(firstVisibleItem>lastVisibleItemPosition){

            //上滑

        }else if(firstVisibleItem<lastVisibleItemPosition){

            //下滑

        }

        //lastVisibleItemPosition=firstVisibleItem;

        }

        });
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: