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;
}
}