ListView适配器(BaseAdapter)和异步操作(Handler)的使用

2 篇文章 0 订阅
1 篇文章 0 订阅
package com.songyan.applock;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Switch;
import android.widget.TextView;

import android.content.Context;
import android.app.ActivityManager;

import java.util.List;

/**
 * Created by songyan on 2017/6/7.
 */

public class AppLockActivity extends Activity implements ListView.OnItemClickListener{

    private ListView lv_app_lock;
    private AppLockAdapter adapter;
    private List<AppInfo> list;
    private AppInfoProvider provider;
    private AppLockDao dao;
    private List<String> lockApps;
    private ProgressBar progressBar;

    //主线程进行UI更新
    private Handler handler = new Handler()
    {
      public void handleMessage(Message msg)
      {
          progressBar.setVisibility(View.GONE);
          adapter=new AppLockAdapter();
          lv_app_lock.setAdapter(adapter);
      }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.app_lock);

        dao=new AppLockDao(this);
        lockApps=dao.getAllPackageName();
        lv_app_lock=(ListView)findViewById(R.id.lv_app_lock);
        progressBar=(ProgressBar)findViewById(R.id.progress_bar);
        lv_app_lock.setOnItemClickListener(this);
        provider=new AppInfoProvider(this);

        initAppInfos();
    }


    //开一个新的线程来获取所有的应用信息
    private void initAppInfos(){
        progressBar.setVisibility(View.VISIBLE);
        new Thread(){
            @Override
            public void run() {
                //获取所有应用的信息是一个比较耗时的操作,需要单独开启一个线程来完成,防止主线程卡死
                list=provider.getAllApps();
                handler.sendEmptyMessage(0);
            }
        }.start();
    }

    private class AppLockAdapter extends BaseAdapter{

        @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) {
            AppInfo info=list.get(position);
            if(convertView==null){
                View view=View.inflate(AppLockActivity.this,R.layout.app_lock_item,null);
                AppViewsHolder viewsHolder=new AppViewsHolder();
                //给视图容器里面的视图对象进行初始化,和布局文件中的具体控件进行关联
                viewsHolder.iv_app_icon=(ImageView)view.findViewById(R.id.iv_app_lock_icon);
                viewsHolder.tv_app_name=(TextView)view.findViewById(R.id.tv_app_lock_name);
                viewsHolder.sw_app_lock=(Switch)view.findViewById(R.id.sw_app_lock);
                //给视图容器里面的视图对象设置具体的内容
                viewsHolder.iv_app_icon.setImageDrawable(info.getIcon());
                viewsHolder.tv_app_name.setText(info.getAppName());
                if(lockApps.contains(info.getPackageName())){
                    viewsHolder.sw_app_lock.setChecked(true);
                    viewsHolder.sw_app_lock.setEnabled(true);
                }else{
                    viewsHolder.sw_app_lock.setChecked(false);
                    viewsHolder.sw_app_lock.setEnabled(false);
                }
                //给每个item视图绑定视图容器对象
                view.setTag(viewsHolder);
                return view;
            }
            else{
                //通过获取已经绑定的convertView可以减少关联布局文件控件的操作,提升ListView的性能
                AppViewsHolder viewsHolder=(AppViewsHolder)convertView.getTag();
                viewsHolder.iv_app_icon.setImageDrawable(info.getIcon());
                viewsHolder.tv_app_name.setText(info.getAppName());
                if(lockApps.contains(info.getPackageName())){
                    viewsHolder.sw_app_lock.setChecked(true);
                    viewsHolder.sw_app_lock.setEnabled(true);
                }else{
                    viewsHolder.sw_app_lock.setChecked(false);
                    viewsHolder.sw_app_lock.setEnabled(false);
                }
                return convertView;
            }
        }
    }
    //将布局文件的控件封装成一个控件容器类
    private class AppViewsHolder{
        ImageView iv_app_icon;
        TextView tv_app_name;
        Switch sw_app_lock;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        AppInfo info=list.get(position);
        String packageName=info.getPackageName();
        Switch switchButton=(Switch)view.findViewById(R.id.sw_app_lock);
        if(dao.find(packageName)){
            dao.delete(packageName);
            lockApps.remove(packageName);
            switchButton.setChecked(false);
            switchButton.setEnabled(false);
        }else{
            dao.add(info.getPackageName());
            lockApps.add(packageName);
            switchButton.setChecked(true);
            switchButton.setEnabled(true);
        }
    }
}
ArrayAdapter,SimpleAdapter,BaseAdapter详解 https://www.cnblogs.com/huolan/p/5126794.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值