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

概述

这是读书笔记的第二篇,主要的内容就是关于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值