Android群英传读书笔记第四章 (ListView使用技巧)

来源:互联网 发布:软件项目管理 pdf下载 编辑:程序博客网 时间:2024/04/30 03:19

概述

这是读书笔记的第二篇,主要的内容就是关于ListView展开的,ListView是我们开发中用的比较多的一个控件,所以很有必要好好研究一下。

笔记

给ListView设置空视图
当ListView中没有数据时,我们可以显示一个空的视图

<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.example.androidheros.MainActivity">    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="match_parent"       />    <ImageView        android:id="@+id/empty_view"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:src="@mipmap/ic_launcher"        /></FrameLayout>
 listView = (ListView) findViewById(R.id.listview);        listView.setEmptyView(findViewById(R.id.empty_view));

这里写图片描述

List状态监听

  listView.setOnScrollListener(new AbsListView.OnScrollListener() {           private int lastVisiblePosition = listView.getLastVisiblePosition();           @Override           public void onScrollStateChanged(AbsListView view, int scrollState) {               switch (scrollState){                   case SCROLL_STATE_IDLE://停止滑动                       break;                   case SCROLL_STATE_TOUCH_SCROLL://正在滑动                       break;                   case SCROLL_STATE_FLING://抛出                       break;               }           }           @Override           public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {                //出现最后一个条目                if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){                }               //到第一个条目               if(firstVisibleItem == 0){               }               if(firstVisibleItem> lastVisiblePosition){                   System.out.println("==========下滑");               }else if(firstVisibleItem< lastVisiblePosition){                   System.out.println("==========上滑");               }               lastVisiblePosition = firstVisibleItem;           }       });    }}

让ListView弹性滑动
默认情况下,ListView滑动到最顶部值不能继续向下滑的,我们可以重写一个方法来实现弹性滑动。
这里写图片描述

  @Override    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, 100, isTouchEvent);    }

这里我们指定maxOverScrollY为100。具体应用时我们可以根据屏幕的密度计算滑动的距离。

自动显示与隐藏布局的ListView
注意:
添加headerview要在设置adapter之前
获取被认为是滑动的最小距离

scaledTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();

onTouch事件中一般返回false,因为我们要让onTouchEvent处理事件

如何获取ActionBar的高度

 /**     * 设置头布局,注意:这个头布局的高度要和ToolBar的高度一致     */    public void initHeadView(){        View view = new View(this);        AbsListView.LayoutParams params = new AbsListView.LayoutParams                (AbsListView.LayoutParams.MATCH_PARENT,                        (int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material));        view.setLayoutParams(params);        listView.addHeaderView(view);    }

不同布局的ListView
重写两个方法

   /**         * 返回position个item的类型         * @param position         * @return         */        @Override        public int getItemViewType(int position) {            return super.getItemViewType(position);        }        /**         * 总共有多少中类型         * @return         */        @Override        public int getViewTypeCount() {            return super.getViewTypeCount();        }

最后我们在getView方法中去判断,做不同的处理,比如填充不同的布局

  public View getView(int position, View convertView, ViewGroup parent) {            if(getItemViewType(position)==0){            }else{            }            ......        }

动态改变ListView布局
这里写图片描述

public class MainActivity extends AppCompatActivity {    private ListView listView;    String[] datas = {"A","B","C","D","E","F","G","H","I","J",            "K","L","M","N","O"};    private List<String> mDatas;    private MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView) findViewById(R.id.listview);        mDatas = Arrays.asList(datas);        adapter = new MyAdapter(mDatas, this);        listView.setAdapter(adapter);        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                adapter.setCurrentItem(position);                adapter.notifyDataSetChanged();            }        });    }    class MyAdapter extends BaseAdapter{        private List<String> datas;        private Context mContext;        private int mCurrentPosition;        public MyAdapter(List<String> datas,Context context){            this.datas = datas;            mContext = context;        }        @Override        public int getCount() {            return datas.size();        }        @Override        public Object getItem(int position) {            return datas.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            LinearLayout layout = new LinearLayout(mContext);            layout.setOrientation(LinearLayout.VERTICAL);            if(mCurrentPosition == position){                layout.addView(addFocusView(position));            }else{                layout.addView(addNormalView(position));            }            return layout;        }        public void setCurrentItem(int position){            mCurrentPosition = position;        }    }    public View addNormalView(int position){        LinearLayout layout = new LinearLayout(this);        layout.setGravity(Gravity.CENTER_VERTICAL);        layout.setOrientation(LinearLayout.HORIZONTAL);        ImageView imageView = new ImageView(this);        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams                (LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);        imageView.setImageResource(R.mipmap.ic_launcher);        layout.addView(imageView,params);        TextView textView = new TextView(this);        textView.setText(mDatas.get(position));        LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams                (LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);        layout.addView(textView,params2);        return layout;    }    public View addFocusView(int position){        ImageView imageView = new ImageView(this);        imageView.setImageResource(R.mipmap.ic_launcher);        return imageView;    }}
0 0
原创粉丝点击