资讯专栏INFORMATION COLUMN

Android ListView

dongxiawu / 1243人阅读

摘要:的三种适配器支持集合,只能展现一行文字具有扩展性,可以自定义多种效果抽象类,继承这个类并且重写相关方法常用属性设置分割线的颜色或图片分割线不显示滚动条去掉上边和下边黑色的阴影设置快速滚动设置长按试背景色高亮显示列表在最下面设置背景时消除拖动

ListView的三种适配器

ArrayAdapter 支持list集合,只能展现一行文字

SimpleAdapter 具有扩展性,可以自定义多种效果

BaseAdapter 抽象类,继承这个类并且重写相关方法

常用属性

android:divider 设置分割线的颜色或图片

android:divider 分割线

android:scrollbars="none" 不显示滚动条

android:fadingEdge="none" 去掉上边和下边黑色的阴影

android:fastScrollEnable="true" 设置快速滚动

android:drawSelectorOnTop="true" 设置长按试背景色高亮

android:stackFromBottom="true" 显示列表在最下面

android:cacheColorHint=“#000000” 设置背景时消除拖动的黑色阴影

android:headerDividersEnabled=“false” 不会在页眉画分割线

android:footerDividersEnabled=“false” 不会在页脚画分割线

android:descendantFocusability="blocksDescendants" 给子view设置,取消子控件的焦点

ArrayAdapter 1.系统自带布局

simple_list_item_1 : 多带带一行的文本框,常用

simple_list_item_2 : 两个文本框组成

simple_list_item_checked : 每项都是由一个已选中的列表项 慎用

imple_list_item_multiple_choice : 都带有一个复选框 慎用

simple_list_item_single_choice : 都带有一个单选钮 慎用

setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL) 设置多选状态 慎用

2.实例
listview.setAdapter(new ArrayAdapter(this,
                android.R.layout.simple_list_item_multiple_choice,new String[]{"元旦","清明","劳动节","端午节","中秋节"}));
 SimpleAdapter
List> mList = new ArrayList>();
for (int i = 0; i < idCard.length; i++) {
        Map map = new HashMap();
        map.put("name", idCard[i]);
        map.put("sex",  "sex"+i);
        map.put("number","number"+i);
        list.add(map);
}


SimpleAdapter adapter = new SimpleAdapter(this, mList,
                       R.layout.item_listview, new String[] { "name", "sex","number" }, 
              newint[] {R.id.listview_item_name,R.id.listview_item_sex,R.id.listview_item_number });
自定义BaseAdapter模板
class MyAdapter extends BaseAdapter {
    private Context context = null;
    public MyAdapter(Context context) {
            this.context = context;
    }
    @Override
    public int getCount() {
            return list.size();
    }
    @Override
    public Object getItem(int position) {
            return list.get(position);
    }
    @Override
    public long getItemId(int position) {
            return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder mHolder;
            if (convertView == null) {
                    mHolder = new ViewHolder();
                    LayoutInflater inflater = LayoutInflater.from(context);
                    convertView = inflater.inflate(R.layout.item_listview, null, true);
                    mHolder.text_item_listview_username = (TextView) convertView.findViewById(R.id.listview_item_name);
                    mHolder.text_item_listview_email = (TextView) convertView.findViewById(R.id.listview_item_sex);
                    mHolder.imageView_item_listview_headpic = (ImageView) convertView.findViewById(R.id.listview_item_number);
                    convertView.setTag(mHolder);
            } else {
                    mHolder = (ViewHolder) convertView.getTag();
            }
            String name = list.get(position).get("name").toString();
            String sex = list.get(position).get("sex").toString();
            String number = list.get(position).get("number").toString();

       mHolder.listview_item_name.setText(name); mHolder.listview_item_sex.setText(sex); mHolder.listview_item_number.setText(number); return convertView; } class ViewHolder { private TextView listview_item_name; private TextView listview_item_sex; private TextView listview_item_number; } }
实现上拉刷新功能的ListView 1.自定义Adapter
public class MyListView extends ListView implements OnScrollListener{
    
    private FootLayout flayout;
    private Scroller scroller;
    private ListViewListener lvListener;
    private float mlastY;
    private int itemConut=-1;
    private int PULL_LOAD_MORE_DELTA=150;
    private int SCROLL_DURATION=400;
    public MyListView(Context context) {
        super(context);
        initView(context);
        // TODO Auto-generated constructor stub
    }
    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
        // TODO Auto-generated constructor stub
    }
    public MyListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
        // TODO Auto-generated constructor stub
    }
    public void initView(Context context){
        super.setOnScrollListener(this);
        scroller=new Scroller(context, new DecelerateInterpolator());
        flayout= new FootLayout(context);
        flayout.setState(FootLayout.STATE_NO);
        flayout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                statrView();
            }
        });
    }
    @Override
    public void setAdapter(ListAdapter adapter) {
        // TODO Auto-generated method stub
        addFooterView(flayout);
        super.setAdapter(adapter);
    }
    public void statrView(){
        flayout.setState(FootLayout.STATE_LOADING);
        if(lvListener!=null){
            lvListener.onLoadMore();
        }
    }
    public void stopView(){
        flayout.setState(FootLayout.STATE_NO);
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // TODO Auto-generated method stub
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mlastY=ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float deltaY=ev.getRawY()-mlastY;
                mlastY=ev.getRawY();
                if(getLastVisiblePosition()==itemConut-1){
                    updateFooterHeight(-deltaY);
                }
                break;
            default:
                if (getLastVisiblePosition() == itemConut - 1) {
                    
                    // 调用加载更多
                    if (flayout.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
                        statrView();// 如果底部视图高度大于可以加载高度,那么就开始加载
                    }
                    resetFooterHeight();// 重置加载更多视图高度
                }
                break;
        }
        return super.onTouchEvent(ev);
    }
    private void updateFooterHeight(float arg0){
        int height=flayout.getBottomMargin()+(int)arg0;
            if (height > PULL_LOAD_MORE_DELTA) { 
                flayout.setState(FootLayout.STATE_READY);
            } else {
                flayout.setState(FootLayout.STATE_NO);
            }
        flayout.setBottomMargin(height);
    }
    private void resetFooterHeight() {
        int bottomMargin = flayout.getBottomMargin();
        if (bottomMargin > 0) {
            scroller.startScroll(0, bottomMargin, 0, -bottomMargin,
                    SCROLL_DURATION);
            invalidate();
        }
    }
    @Override
    public void computeScroll() {
        if (scroller.computeScrollOffset()) {
            flayout.setBottomMargin(scroller.getCurrY());
            postInvalidate();
        }
        super.computeScroll();
    }
    public interface ListViewListener {
        public void onLoadMore();
    }
    public void setListViewListener(ListViewListener l) {
        lvListener=l;
    }
    @Override
    public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        itemConut=arg3;
    }
    @Override
    public void onScrollStateChanged(AbsListView arg0, int arg1) {
        // TODO Auto-generated method stub
    }
    
}
2.底部FootLayout
public class FootLayout extends LinearLayout{
    static int STATE_READY=0,STATE_LOADING=1,STATE_NO=2;
    private RelativeLayout rlayout;
    private TextView tv;
    private ProgressBar pb;
    public FootLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
        initView(context);
    }
    public FootLayout(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        initView(context);
    }
    public void initView(Context context){
        LinearLayout layout=(LinearLayout) LayoutInflater.from(context).inflate(R.layout.foot_view, null);
        addView(layout);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
            LayoutParams.WRAP_CONTENT));
        rlayout=(RelativeLayout) layout.findViewById(R.id.foot_rlayout);
        tv=(TextView) layout.findViewById(R.id.foot_text);
        pb=(ProgressBar) layout.findViewById(R.id.foot_progressbar);
    }
    public void hide(){
        rlayout.setVisibility(View.VISIBLE);
    }
    public void show(){
        rlayout.setVisibility(View.INVISIBLE);
    }
    public void setState(int state){
        tv.setVisibility(View.INVISIBLE);
        pb.setVisibility(View.INVISIBLE);
        if(state==STATE_READY){
            tv.setVisibility(View.VISIBLE);
            tv.setText("松开显示更多");
        }else if(state==STATE_LOADING){
            pb.setVisibility(View.VISIBLE);
        }else{
            tv.setVisibility(View.VISIBLE);
            tv.setText("加载更多");
        }
    }
    public void setBottomMargin(int height) {
        if (height < 0)
            return;
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) rlayout
                .getLayoutParams();
        lp.bottomMargin = height;
        rlayout.setLayoutParams(lp);
    }

    public int getBottomMargin() {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) rlayout
                .getLayoutParams();
        return lp.bottomMargin;
    }
}
3.底部FootLayout的布局


    
        
        
        
        
    

4.使用MyListView
public class MainActivity extends Activity implements IXListViewListener{
    private ListViews mylists;
    private SimpleAdapter mAdapter;
    private List> mlist;
    private Handler mHandler;   
    @Override  
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  
        mylists =(ListViews) findViewById(R.id.myListView);
        mlist=new ArrayList>();
        mAdapter = new SimpleAdapter(MainActivity.this, getData(),
                R.layout.list_item, new String[] { "name", "img", "content" },
                new int[] { R.id.title, R.id.mImage, R.id.content });
        mylists.setAdapter(mAdapter);
        mylists.setPullLoadEnable(true);
        mylists.setXListViewListener(this);
        mHandler = new Handler();
    }
    String data[] = new String[] { "勇士", "火箭", "湖人",
            "凯尔特人", "雷霆" };
    String data1[] = new String[] { "汤普森", "哈登", "詹姆斯",
            "塔图姆", "维斯布鲁克" };

    private List> getData() {
        for (int i = 0; i < data.length; i++) {
            Map map = new HashMap();
            map.put("name", data[i]);
            map.put("content", data1[i]);
            map.put("img", R.drawable.ic_launcher);
            mlist.add(map);
        }
        return mlist;
    }  
        // 加载更多
        @Override
        public void onLoadMore() {
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    getData();
                    mAdapter.notifyDataSetChanged();
                    onLoad();
                }
            }, 1500);  
        }
        private void onLoad() {
            mylists.stopLoadMore();
        }
}

 

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2810.html

相关文章

  • ListView 使用详解

    showImg(https://segmentfault.com/img/remote/1460000019975019?w=157&h=54); 极力推荐文章:欢迎收藏Android 干货分享 showImg(https://segmentfault.com/img/remote/1460000019975020); 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章...

    clasnake 评论0 收藏0
  • Andorid关于如何获取listview中子item的控件的问题

    摘要:而最重要的方法就是方法,在此方法内的绘制核心的核心,内控件的寻找,事件的设定都能做。 Andorid 开发中我们常常会用到listview这个控件,而listview中如何获取到子item的控件并设置相应事件则相对复杂,并且自定义listview常常需要自定义适配器等等,下面这篇文章将主要介绍如何获取item控件并设置响应事件,主要实现如何点击listview子item中的一个按钮跳转...

    CarlBenjamin 评论0 收藏0
  • 仿掘金框架之listview全解(一)

    摘要:当设为时,将不会在各个之间绘制默认为。当然这次仿掘金的用了实现了下拉刷新,后面会针对这个写一篇的大家也别急而这个中依然也用到了。 showImg(https://segmentfault.com/img/remote/1460000006788254); 文章首发:Android程序员日记 作者:贤榆的鱼 测试阅读时间:8min 前言 有有很长一段时间没有更新了,这次给大家带来了一...

    Acceml 评论0 收藏0
  • 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存

    摘要:数据源频繁更新的场景,如弹幕等的优势会非常明显进一步来讲,结论是列表页展示界面,需要支持动画,或者频繁更新,局部刷新,建议使用,更加强大完善,易扩展其它情况如微信卡包列表页两者都,但在使用上会更加方便,快捷。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerV...

    wangzy2019 评论0 收藏0
  • 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存

    摘要:数据源频繁更新的场景,如弹幕等的优势会非常明显进一步来讲,结论是列表页展示界面,需要支持动画,或者频繁更新,局部刷新,建议使用,更加强大完善,易扩展其它情况如微信卡包列表页两者都,但在使用上会更加方便,快捷。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerV...

    kun_jian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<