Android listView 里面的 ViewHolder通用写法非常棒

1、展开、收起状态栏 

复制代码
     public  static  final  void collapseStatusBar(Context ctx) {
        Object sbservice = ctx.getSystemService("statusbar");
         try {
            Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
            Method collapse;
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                collapse = statusBarManager.getMethod("collapsePanels");
            }  else {
                collapse = statusBarManager.getMethod("collapse");
            }
            collapse.invoke(sbservice);
        }  catch (Exception e) {
            e.printStackTrace();
        }
    }

     public  static  final  void expandStatusBar(Context ctx) {
        Object sbservice = ctx.getSystemService("statusbar");
         try {
            Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
            Method expand;
             if (Build.VERSION.SDK_INT >= 17) {
                expand = statusBarManager.getMethod("expandNotificationsPanel");
            }  else {
                expand = statusBarManager.getMethod("expand");
            }
            expand.invoke(sbservice);
        }  catch (Exception e) {
            e.printStackTrace();
        }
    }
复制代码

用途:可用于点击Notifacation之后收起状态栏
 

2、 获取状态栏高度

复制代码
     public  static  int getStatusBarHeight(Context context){
        Class<?> c =  null;
        Object obj =  null;
        Field field =  null;
         int x = 0, statusBarHeight = 0;
         try {
            c = Class.forName("com.android.internal.R$dimen");
            obj = c.newInstance();
            field = c.getField("status_bar_height");
            x = Integer.parseInt(field.get(obj).toString());
            statusBarHeight = context.getResources().getDimensionPixelSize(x);
        }  catch (Exception e1) {
            e1.printStackTrace();
        }
         return statusBarHeight;
    }
复制代码

 

3、ListView使用ViewHolder极简写法

复制代码
     public  static <T  extends View> T getAdapterView(View convertView,  int id) {
        SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag();
         if (viewHolder ==  null) {
            viewHolder =  new SparseArray<View>();
            convertView.setTag(viewHolder);
        }
        View childView = viewHolder.get(id);
         if (childView ==  null) {
            childView = convertView.findViewById(id);
            viewHolder.put(id, childView);
        }
         return (T) childView;
    }
复制代码

用法:

复制代码
    @Override
     public View getView( int position, View convertView, ViewGroup parent) {
         if (convertView ==  null) {
            convertView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_feed_item, parent,  false);
        }

        ImageView thumnailView = getAdapterView(convertView, R.id.video_thumbnail);
        ImageView avatarView =  getAdapterView(convertView, R.id.user_avatar);
        ImageView appIconView = getAdapterView(convertView, R.id.app_icon);
复制代码

  用起来非常简练,将ViewHolder隐于无形。

 

4、 设置Activity透明

复制代码
     < style  name ="TransparentActivity"  parent ="AppBaseTheme" >
         < item  name ="android:windowBackground" >@android:color/transparent </ item >
         < item  name ="android:colorBackgroundCacheHint" >@null </ item >
         < item  name ="android:windowIsTranslucent" >true </ item >
         < item  name ="android:windowNoTitle" >true </ item >
         < item  name ="android:windowContentOverlay" >@null </ item >
     </ style >
复制代码

说明:AppBaseTheme一般是你application指定的android:theme是啥这里就是啥,否则Activity内部的空间风格可能不一致。

用途:用于模拟Dialog效果,比如再Service中没法用Dialog,就可以用Activity来模拟

 

5、 代码切换全屏

复制代码
// 切换到全屏
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

// 切换到非全屏
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
复制代码

注意:切换到全屏时,底部的虚拟按键仍然是显示的。次方法可多次调用用于切换

用途:播放器界面经常会用到 

 

6、调用开发者选项中显示触摸位置功能

android.provider.Settings.System.putInt(getContentResolver(), "show_touches", 1);

设置1显示,设置0不显示。

 

7、获取设备上已安装并且可启动的应用列表

            Intent intent =  new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);

            List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, 0)

注意:使用getInstalledApplications会返回很多无法启动甚至没有图标的系统应用。ResolveInfo.activityInfo.applicationInfo也能取到你想要的数据。

 

Android中,ListView是一个常见的用于显示列表数据的组件。为了提高性能并减少内存消耗,ListView使用了View Holder设计模式。View Holder的作用是在每个ListItem不再需要时复用其视图,而不是每次滚动时都创建新的View。 举个例子,假设我们有一个简单的Adapter,它负责将List<YourItem>的数据填充到ListView: ```java public class YourListAdapter extends ArrayAdapter<YourItem> { private ViewHolder viewHolder; public static class ViewHolder { TextView textViewName; ImageView imageViewIcon; // 其他可能的视图... } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_view, parent, false); viewHolder.textViewName = convertView.findViewById(R.id.text_view_name); viewHolder.imageViewIcon = convertView.findViewById(R.id.image_view_icon); // 绑定ViewHolder convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } YourItem item = getItem(position); viewHolder.textViewName.setText(item.getName()); viewHolder.imageViewIcon.setImageResource(item.getIconResourceId()); return convertView; } } ``` 在这个例子中,当列表滚动时,如果`convertView`(已经缓存的视图)不是null,我们就直接复用它;如果`convertView`是null,我们就新创建一个,并将其放入缓存。这样可以显著减少垃圾回收的工作量,提升应用程序的响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值