一、ListView基础案例
首先定义一个接收每一天item的布局
item.app.list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/app_icon_image_view" android:layout_width="60dp" android:layout_height="60dp" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/app_name_text_view" android:layout_width="60dp" android:layout_height="60dp" android:paddingLeft="6dp" android:textSize="20sp" android:gravity="center_vertical" android:text="@string/app_name"/> </LinearLayout>
在activity_main.xml中定义一个ListView控件的摆放位置
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/app_list_view" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout>
创建一个Adapter适配器,将item不断的往ListView容器中填充
MainActivity.java
package com.administrator.listviewdemo; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView app_list_view = (ListView)findViewById(R.id.app_list_view); List<String> appName = new ArrayList<>(); appName.add("QQ"); appName.add("微信"); appName.add("haha"); app_list_view.setAdapter(new AppListAdapter(appName)); } /** * 定义适配器操作数据 */ public class AppListAdapter extends BaseAdapter{ List<String> mAppNames; public AppListAdapter(List<String> appName){ mAppNames = appName; } @Override public int getCount() { //有多少条数据 return mAppNames.size(); } @Override public Object getItem(int position) { //获取当前position位置的这一条 return mAppNames.get(position); } @Override public long getItemId(int position) { //获取当前position位置的这一条的ID return position; } /** * 这里还应该写一个ViewHolder,考虑到初学者的理解方便,暂时不写 */ @Override public View getView(int position, View convertView, ViewGroup parent) { //处理 view--data 填充数据的一个过程 LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = layoutInflater.inflate(R.layout.item_app_list,null); if(convertView != null){ ImageView appIconImageViw = (ImageView)convertView.findViewById(R.id.app_icon_image_view); TextView appNameTextView = (TextView) convertView.findViewById(R.id.app_name_text_view); appNameTextView.setText(mAppNames.get(position)); } return convertView; } } }
ViewHolder有什么好处呢,因为TextView appNameTextView写在了ViewHolder里面,这样,getView方法就不用每次都去布局文件中拿View,提高了效率
二、使用listView制作获取手机应用并快速打开功能
item_app_list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/app_icon_image_view" android:layout_width="60dp" android:layout_height="60dp" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/app_name_text_view" android:layout_width="60dp" android:layout_height="60dp" android:paddingLeft="6dp" android:textSize="20sp" android:gravity="center_vertical" android:text="@string/app_name"/> </LinearLayout>
header_list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="60dp" android:src="@mipmap/ic_launcher"/> </LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/app_list_view" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout>
package com.administrator.listviewdemo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ComponentInfo; import android.content.pm.ResolveInfo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView app_list_view = (ListView)findViewById(R.id.app_list_view); //添加标题的headerView //解析LayoutInflater LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); View headerView = layoutInflater.inflate(R.layout.header_list,null); app_list_view.addHeaderView(headerView); final List<ResolveInfo> appInfos = getAppInfos(); app_list_view.setAdapter(new AppListAdapter(getAppInfos())); /** * ListView在外面调用的方法 */ app_list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //拿到应用的包名 String packageName = appInfos.get(position).activityInfo.packageName; //拿到主要的类名 String classString = appInfos.get(position).activityInfo.name; ComponentName componentName = new ComponentName(packageName,classString); final Intent intent= new Intent(); //通过Intent设置主键 intent.setComponent(componentName); startActivity(intent); } }); /** * 长按时候 */ app_list_view.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "长按", Toast.LENGTH_SHORT).show(); return false; } }); } /** * 获取所有的用户信息 * @return */ private List<ResolveInfo> getAppInfos(){ Intent intent = new Intent(Intent.ACTION_MAIN,null); intent.addCategory(Intent.CATEGORY_LAUNCHER); return getPackageManager().queryIntentActivities(intent,0); } /** * 定义适配器操作数据 */ public class AppListAdapter extends BaseAdapter{ List<ResolveInfo> mAppInfo; public AppListAdapter(List<ResolveInfo> appName){ mAppInfo = appName; } @Override public int getCount() { //有多少条数据 return mAppInfo.size(); } @Override public Object getItem(int position) { //获取当前position位置的这一条 return mAppInfo.get(position); } @Override public long getItemId(int position) { //获取当前position位置的这一条的ID return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { //处理 view--data 填充数据的一个过程 LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = layoutInflater.inflate(R.layout.item_app_list,null); if(convertView != null){ ImageView appIconImageView = (ImageView)convertView.findViewById(R.id.app_icon_image_view); TextView appNameTextView = (TextView) convertView.findViewById(R.id.app_name_text_view); appNameTextView.setText(mAppInfo.get(position).activityInfo.loadLabel(getPackageManager())); appIconImageView.setImageDrawable(mAppInfo.get(position).activityInfo.loadIcon(getPackageManager())); } // //为点击的条目设置点击事件,在getView内部设置点击事件的方法 // convertView.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // //拿到应用的包名 // String packageName = mAppInfo.get(position).activityInfo.packageName; // //拿到主要的类名 // String classString = mAppInfo.get(position).activityInfo.name; // // ComponentName componentName = new ComponentName(packageName,classString); // final Intent intent= new Intent(); // //通过Intent设置主键 // intent.setComponent(componentName); // startActivity(intent); // } // }); return convertView; } } }
MainActivity.java
增加ViewHolder优化后,修改部分的代码如下:
MainActivity.java
@Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder =new ViewHolder(); //处理 view--data 填充数据的一个过程 if(convertView != null) { //减少了每次都解析Layout转化为View,和findViewById查找的消耗 LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = layoutInflater.inflate(R.layout.item_app_list, null); viewHolder.mAppIconImageView = (ImageView)convertView.findViewById(R.id.app_icon_image_view); viewHolder.mAppNameTextView = (TextView) convertView.findViewById(R.id.app_name_text_view); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.mAppIconImageView.setImageDrawable(mAppInfo.get(position).activityInfo.loadIcon(getPackageManager())); viewHolder.mAppNameTextView.setText(mAppInfo.get(position).activityInfo.loadLabel(getPackageManager())); return convertView; } public class ViewHolder{ public ImageView mAppIconImageView; public TextView mAppNameTextView; }
完整代码如下:
MainActivity.java
package com.administrator.listviewdemo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ComponentInfo; import android.content.pm.ResolveInfo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView app_list_view = (ListView)findViewById(R.id.app_list_view); //添加标题的headerView //解析LayoutInflater LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); View headerView = layoutInflater.inflate(R.layout.header_list,null); app_list_view.addHeaderView(headerView); final List<ResolveInfo> appInfos = getAppInfos(); app_list_view.setAdapter(new AppListAdapter(getAppInfos())); /** * ListView在外面调用的方法 */ app_list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //拿到应用的包名 String packageName = appInfos.get(position).activityInfo.packageName; //拿到主要的类名 String classString = appInfos.get(position).activityInfo.name; ComponentName componentName = new ComponentName(packageName,classString); final Intent intent= new Intent(); //通过Intent设置主键 intent.setComponent(componentName); startActivity(intent); } }); /** * 长按时候 */ app_list_view.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "长按", Toast.LENGTH_SHORT).show(); return false; } }); } /** * 获取所有的用户信息 * @return */ private List<ResolveInfo> getAppInfos(){ Intent intent = new Intent(Intent.ACTION_MAIN,null); intent.addCategory(Intent.CATEGORY_LAUNCHER); return getPackageManager().queryIntentActivities(intent,0); } /** * 定义适配器操作数据 */ public class AppListAdapter extends BaseAdapter{ List<ResolveInfo> mAppInfo; public AppListAdapter(List<ResolveInfo> appName){ mAppInfo = appName; } @Override public int getCount() { //有多少条数据 return mAppInfo.size(); } @Override public Object getItem(int position) { //获取当前position位置的这一条 return mAppInfo.get(position); } @Override public long getItemId(int position) { //获取当前position位置的这一条的ID return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder =new ViewHolder(); //处理 view--data 填充数据的一个过程 if(convertView != null) { //减少了每次都解析Layout转化为View,和findViewById查找的消耗 LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = layoutInflater.inflate(R.layout.item_app_list, null); viewHolder.mAppIconImageView = (ImageView)convertView.findViewById(R.id.app_icon_image_view); viewHolder.mAppNameTextView = (TextView) convertView.findViewById(R.id.app_name_text_view); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.mAppIconImageView.setImageDrawable(mAppInfo.get(position).activityInfo.loadIcon(getPackageManager())); viewHolder.mAppNameTextView.setText(mAppInfo.get(position).activityInfo.loadLabel(getPackageManager())); return convertView; } public class ViewHolder{ public ImageView mAppIconImageView; public TextView mAppNameTextView; } } }