美文网首页
ListView相关知识小结

ListView相关知识小结

作者: s0me0ne | 来源:发表于2017-08-26 17:03 被阅读5次

    Android开发中,ListView常常被用来展示内容超过屏幕大小的数据,可以通过上下滑动展示内容。

    ListView复用提高性能

    为了提高性能,在使用ListView的时候使用ViewHolder是一个不错的方法,通过复用超出屏幕外的convertView,在展示很多列表时只需要在刚开始时创建充满当前屏幕的组件,在接下来的展示中,通过不断的复用已经生成的convertView,从而极大的节省性能。

    ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = View.inflate(mContext, mResourceId, null);
            viewHolder = new ViewHolder();
            viewHolder.textView = convertView.findViewById(R.id.textView);
            viewHolder.button = convertView.findViewById(R.id.button);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
       
    class ViewHolder {
        TextView textView;
        Button button;
    }
    

    复用和异步加载导致的问题

    当ListView的item中有诸如图片,进度条等需要异步加载的控件时,而不加判断时,由于复用的存在,当上下滑动屏幕时,被复用的convertView就会被后台发送的数据更新。这样就会导致在滑动屏幕的时候,图片加载错位或者进度显示异常。
    解决方法是,对后台任务做一判断,当后台任务对应的控件处于不可见状态时停止发送更新命令。

    Adapter.java

    private BroadcastReceiver mDownloadReceiver = new 
    BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("adapter")
                    && intent.getExtras() != null) {
                
                //do sth
    
                //判断是否可见,如果可见才更新控件状态
                if (MainActivity.isVisiable(itemBuffer.position)) {
                    button.setText("progress " + progress);
                }
    
            }
        }
    };
    

    MainActivity.java

    if (position >= mListview.getFirstVisiblePosition()
    public static boolean isVisiable(int position){
        boolean isVisible = false;
        if (position >= mListview.getFirstVisiblePosition()
                && position <= mListview.getLastVisiblePosition()) {
            isVisible = true;
        }
        return isVisible;
    }

    相关文章

      网友评论

          本文标题:ListView相关知识小结

          本文链接:https://www.haomeiwen.com/subject/maxvdxtx.html