ListView的学习

来源:互联网 发布:网络运营商怎么设置 编辑:程序博客网 时间:2024/06/15 09:23

ListView的学习
创建ListView的步骤
1:布局里创建ListView控件
2:给ListView创建每一个的item布局
3:准备数据源
4:在Adapter里适配数据
5:给ListView设置适配器

适配器里的4个抽象方法:
getCount(); 返回数据源的个数
getItem();返回条目
getItemId();返回条目id
getView();//适配器里最重要的方法,设置数据适配的过程.
一开始获取LayoutInflater的实例,用它的实例来获取item布局的layout
然后获取控件 设置数据 返回view


最简单的listview

public class MainActivity extends AppCompatActivity {    private List<String> mAppName;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);       ListView mListView = (ListView) findViewById(R.id.list_view);        mAppName = new ArrayList<>();        mAppName.add("QQ");        mAppName.add("旺旺");        mAppName.add("喵喵");        mListView.setAdapter(new mAdapter());    }    class mAdapter  extends BaseAdapter{        @Override        public int getCount() {            return mAppName.size();        }        @Override        public Object getItem(int position) {            return mAppName.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            /**             * 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。 具体作用:             1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;             2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。             获得 LayoutInflater 实例的三种方式:             1.LayoutInflater inflater = getLayoutInflater();  //调用Activity的getLayoutInflater()             2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);             3. LayoutInflater inflater = LayoutInflater.from(context);             */            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);            convertView = inflater.inflate(R.layout.item_app_view,null);            ImageView mIcon = (ImageView) convertView.findViewById(R.id.item_app_icon);            TextView mText = (TextView)convertView.findViewById(R.id.item_app_text);            mText.setText(mAppName.get(position));            return convertView;        }    }





获取系统已安装的列表Demo和添加头布局,listView点击事件

转自:http://blog.csdn.net/maoxiao1229/article/details/38301657/#comments方法1:ResolveInfo获取全部应用:      PackageManager packageManager = getPackageManager();      Intent mIntent = new Intent(Intent.ACTION_MAIN, null);      mIntent.addCategory(Intent.CATEGORY_LAUNCHER);      List<ResolveInfo> listAllApps = packageManager.queryIntentActivities(mIntent, 0);     判断是否系统应用:      ResolveInfo appInfo = listAllApps.get(position);      String pkgName = appInfo.activityInfo.packageName;//获取包名      //根据包名获取PackageInfo mPackageInfo;(需要处理异常)      mPackageInfo = mContext.getPackageManager().getPackageInfo(pkgName, 0);      if ((mPackageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {              //第三方应用          } else {              //系统应用          }  获取相关信息:  ResolveInfo mResolveInfo ;  获取包名: mResolveInfo.activityInfo.packageName;  获取icon: mResolveInfo.loadIcon(packageManager);  获取应用名: mResolveInfo.loadLabel(packageManager).toString();  方法2:PackageInfo获取全部应用:  PackageManager packageManager = this.getPackageManager();   List<PackageInfo> packageInfoList = packageInfoList .getInstalledPackages(0);    判断是否系统应用:   List<PackageInfo> apps = new ArrayList<PackageInfo>();   for (int i = 0; i < packageInfoList.size(); i++) {              PackageInfo pak = (PackageInfo)packageInfoList.get(i);              //判断是否为系统预装的应用              if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {                  // 第三方应用                  apps.add(pak);              } else          {          //系统应用          }          }  获取相关信息:  PackageInfo mPackageInfo;  获取包名: mPackageInfo.packageName  获取icon: mPackageInfo.getApplicationIcon(applicationInfo);  获取应用名: mPackageInfo.getApplicationLabel(applicationInfo);  获取使用权限:  mPackageInfo.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS).requestedPermissions;  

跳转系统应用

 //获取包名                String packageName = mAppInfos.get(position).activityInfo.packageName;                //获取应用名                String className = mAppInfos.get(position).activityInfo.name;                //通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。                //实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:                ComponentName componentName = new ComponentName(packageName,className);                Intent intent = new Intent();                intent.setComponent(componentName);                startActivity(intent);

Demo程序:

public class MainActivity extends AppCompatActivity {    private List<ResolveInfo> mAppInfos;    private ListView mListView;    private PackageManager manager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initData();        initListener();    }    private void initView() {        mListView = (ListView) findViewById(R.id.list_view);    }    private void initData() {        //给ListView添加头布局        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);        View inflate = inflater.inflate(R.layout.item_header_view,null);        mListView.addHeaderView(inflate);        //获取包管理器实例        manager = getPackageManager();        Intent mIntent = new Intent(Intent.ACTION_MAIN, null);        mIntent.addCategory(Intent.CATEGORY_LAUNCHER);        //获取系统所有app信息        mAppInfos = manager.queryIntentActivities(mIntent, 0);        mListView.setAdapter(new mAdapter());    }    private void initListener() {        //给listView设置条目点击事件        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                //获取包名                String packageName = mAppInfos.get(position).activityInfo.packageName;                //获取应用名                String className = mAppInfos.get(position).activityInfo.name;                //通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。                //实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:                ComponentName componentName = new ComponentName(packageName,className);                Intent intent = new Intent();                intent.setComponent(componentName);                startActivity(intent);            }        });    }    class mAdapter  extends BaseAdapter{        @Override        public int getCount() {            return mAppInfos.size();        }        @Override        public Object getItem(int position) {            return mAppInfos.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);            convertView = inflater.inflate(R.layout.item_app_view,null);            ImageView mIcon = (ImageView) convertView.findViewById(R.id.item_app_icon);            TextView mText = (TextView)convertView.findViewById(R.id.item_app_text);            //获取应用名            String appName = mAppInfos.get(position).activityInfo.loadLabel(manager).toString();            //获取应用图片资源路径            Drawable drawable = mAppInfos.get(position).activityInfo.loadIcon(manager);            //设置            mText.setText(appName);            mIcon.setImageDrawable(drawable);            return convertView;        }    }}--------------------给getView增加ViewHolder优化点listView的性能----------      public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder holder = new ViewHolder();            //没有复用view的时,使用viewholder保存找到的空间,下次复用不需要再次查找.            if(convertView == null){                LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);                convertView = inflater.inflate(R.layout.item_app_view,null);                holder.mDrawable  = (ImageView) convertView.findViewById(R.id.item_app_icon);                holder.mAppName = (TextView)convertView.findViewById(R.id.item_app_text);                //给复用view设置标记                convertView.setTag(holder);            }else{                //取出标记中的holder                holder = (ViewHolder) convertView.getTag();            }            //获取应用名            String appName =mAppInfos.get(position).activityInfo.loadLabel(manager).toString();            //获取应用图片资源路径            Drawable appDrawable =  mAppInfos.get(position).activityInfo.loadIcon(manager);            holder.mAppName.setText(appName);            holder.mDrawable.setImageDrawable(appDrawable);            return convertView;        }    }    class ViewHolder {        TextView mAppName;        ImageView mDrawable;    }



ListViewDemo异步请求网络,加载到listView中

public class RequestActivity extends AppCompatActivity{    private List<lessonInfo> lessonInfos ;    private static final String TAG = "RequestActivity";    private final String STATUS;    private final String MSG;    private final String NAME;    private ListView mListView;    public RequestActivity() {        STATUS = "status";        MSG = "msg";        NAME = "name";    }    @Override    protected void onCreate( Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        new RequestAsyncTask().execute();    }    private void initView() {        mListView = (ListView) findViewById(R.id.list_view);        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);        View footView = inflater.inflate(R.layout.item_header_view, null);        //添加脚布局        mListView.addFooterView(footView);    }    class RequestAsyncTask extends AsyncTask<Void,Integer,String> {        @Override        protected void onPreExecute() {            super.onPreExecute();            //Loading        }        //在异步里请求数据        @Override        protected String doInBackground(Void... params) {            return request(getString(R.string.request_url));        }        @Override        protected void onPostExecute(String result) {            //Loding结束,刷新数据,处理界面            lessonResult lessonResult = new lessonResult();            try {                JSONObject jsonObject = new JSONObject(result);                String status = jsonObject.getString(STATUS);                String msg = jsonObject.getString(MSG);                lessonResult.setmMessage(msg);                lessonResult.setmStatus(status);                List<lessonInfo> lessonInfos = new ArrayList<>();                JSONArray dataArray = jsonObject.getJSONArray("data");                for (int i = 0; i < dataArray.length(); i++) {                    lessonInfo lessonInfo = new lessonInfo();                    JSONObject tempJsonObject = (JSONObject) dataArray.get(i);                    lessonInfo.setmName(tempJsonObject.getString("name"));                    lessonInfos.add(lessonInfo);                    Log.i(TAG, "onPostExecute: 11111111111111");                }                lessonResult.setmLessInfos(lessonInfos);            } catch (JSONException e) {                e.printStackTrace();            }            //设置适配器            mListView.setAdapter(new RequestAdapter(RequestActivity.this,lessonResult.getmLessInfos()));        }    }    //请求网络,拿到数据    private String request(String stringUrl) {        try {            URL url = new URL(stringUrl);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setReadTimeout(30000);//设置连接超时时间            conn.setRequestMethod("GET");//设置请求方式            int Code = conn.getResponseCode();//获取响应吗            if(Code == HttpURLConnection.HTTP_OK){//请求成功                //开始下载                InputStreamReader isr = new InputStreamReader(conn.getInputStream());                BufferedReader br = new BufferedReader(isr);                //用一个StringBuilder存储数据                StringBuilder sb = new StringBuilder();                String line ;//读取每行数据               while ((line =br.readLine()) !=null){                   sb.append(line);               }               return sb.toString();            }else{            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return null;    }}
public class RequestAdapter extends BaseAdapter {    List<lessonInfo> infos = new ArrayList<>();    Context mContext;    public RequestAdapter(Context context, List<lessonInfo> info) {        infos =info;        mContext = context;    }    @Override    public int getCount() {        return infos.size();    }    @Override    public Object getItem(int position) {        return infos.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = new ViewHolder();        if (convertView == null){            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);            convertView = inflater.inflate(R.layout.item_app_view,null);            holder.mName = (TextView) convertView.findViewById(R.id.item_app_text);            holder.mImageView = (ImageView) convertView.findViewById(R.id.item_app_icon);            convertView.setTag(holder);        }else{            holder = (ViewHolder) convertView.getTag();        }        holder.mName.setText(infos.get(position).getmName());        holder.mImageView.setVisibility(View.GONE);        return convertView;    }    class ViewHolder {        private TextView mName;        private ImageView mImageView;    }}
原创粉丝点击