导读
1.ListView的简单实现
2.获取系统已经安装的应用列表
3.ListView与网络请求结合案例
4.ListView拓展
5.BaseAdapter基础
ListView的简单实现
适配器是用来将ListView视图与数据匹配起来的工具
主页面布局文件 activity_main.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="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
自定义item文件 item_layout
<?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/iv"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/timg"
/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="60dp"
android:paddingLeft="6dp"
android:textSize="20sp"
android:gravity="center_vertical"/>
</LinearLayout>
java文件 MainActivity.java
package com.hala.view01;
import android.app.Activity;
import android.content.Context;
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 Activity {
private ListView lv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.lv);
List<String> appNames=new ArrayList<>();
appNames.add("知乎");
appNames.add("网易公开课");
appNames.add("微信");
//将主页面的ListView与自定义item布局的绑定
lv.setAdapter(new AppListAdapter(appNames));
}
public class AppListAdapter extends BaseAdapter{
List<String> mApp;
public AppListAdapter(List<String> appNames) {
mApp=appNames;
}
/**
*
* @return 一共有多少条数据
*/
@Override
public int getCount() {
return mApp.size();
}
/**
*
* @param position 当前位置
* @return 返回当前position的数据
*/
@Override
public Object getItem(int position) {
return mApp.get(position);
}
/**
*
* @param position 当前位置
* @return 返回当前position的id
*/
@Override
public long getItemId(int position) {
return position;
}
/**
*处理view---data匹配过程
* @param position 当前位置
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//借用LayoutInflater来处理,并拿到自定义的每一个item的布局
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=layoutInflater.inflate(R.layout.item_layout,null);
ImageView imageView=(ImageView)convertView.findViewById(R.id.iv);
TextView textView=(TextView)convertView.findViewById(R.id.tv);
textView.setText(mApp.get(position));
return convertView;
}
}
}
显示结果
获取系统已经安装的应用列表
主页布局文件 activity_main.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="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
自定义headerView布局文件 headerview_layout
<?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">
<ImageView
android:layout_width="match_parent"
android:layout_height="240dp"
android:background="@drawable/conan"/>
</LinearLayout>
java文件 MainActivity.java
package com.hala.view01;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
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 Activity {
private ListView lv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.lv);
//将主页面的ListView与获取的手机信息绑定
lv.setAdapter(new AppListAdapter(getAppInfos()));
//ListView的HeaderView属性
/*
这里实现的效果是顶部图片会随着滑动而动
如果要求顶部图片不动,可以在ListView上边加一个ImageView
*/
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View headerView=layoutInflater.inflate(R.layout.headerview_layout,null);
lv.addHeaderView(headerView);
}
/**
* 获取用户的所有应用信息
* @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> mApp;
public AppListAdapter(List<ResolveInfo> appNames) {
mApp=appNames;
}
/**
*
* @return 一共有多少条数据
*/
@Override
public int getCount() {
return mApp.size();
}
/**
*
* @param position 当前位置
* @return 返回当前position的数据
*/
@Override
public Object getItem(int position) {
return mApp.get(position);
}
/**
*
* @param position 当前位置
* @return 返回当前position的id
*/
@Override
public long getItemId(int position) {
return position;
}
/**
*处理view---data匹配过程
* @param position 当前位置
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//借用LayoutInflater来处理,并拿到自定义的每一个item的布局
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=layoutInflater.inflate(R.layout.item_layout,null);
ImageView imageView=(ImageView)convertView.findViewById(R.id.iv);
TextView textView=(TextView)convertView.findViewById(R.id.tv);
//将app的图标以及标题添加到自定义布局上
textView.setText(mApp.get(position).activityInfo.loadLabel(getPackageManager()));
imageView.setImageDrawable(mApp.get(position).activityInfo.loadIcon(getPackageManager()));
//通过点击app名称实现跳转,实际上是为TextView设置了点击事件
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//设置点击事件以实现跳转的效果
String packageName=mApp.get(position).activityInfo.packageName;
String className=mApp.get(position).activityInfo.name;
ComponentName componentName=new ComponentName(packageName,className);
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
}
});
return convertView;
}
}
}
显示结果
第二种点击事件写法(其他文件相同)
java文件
package com.hala.view01;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
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 java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private ListView lv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.lv);
//将主页面的ListView与获取的手机信息绑定
final List<ResolveInfo> appInfos = getAppInfos();
lv.setAdapter(new AppListAdapter(appInfos));
//ListView的HeaderView属性
/*
这里实现的效果是顶部图片会随着滑动而动
如果要求顶部图片不动,可以在ListView上边加一个ImageView
*/
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View headerView=layoutInflater.inflate(R.layout.headerview_layout,null);
lv.addHeaderView(headerView);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//设置点击事件以实现跳转的效果
//这种方法是针对整个item设置的点击事件
String packageName=appInfos.get(position).activityInfo.packageName;
String className=appInfos.get(position).activityInfo.name;
ComponentName componentName=new ComponentName(packageName,className);
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
}
});
}
/**
* 获取用户的所有应用信息
* @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> mApp;
public AppListAdapter(List<ResolveInfo> appNames) {
mApp=appNames;
}
/**
*
* @return 一共有多少条数据
*/
@Override
public int getCount() {
return mApp.size();
}
/**
*
* @param position 当前位置
* @return 返回当前position的数据
*/
@Override
public Object getItem(int position) {
return mApp.get(position);
}
/**
*
* @param position 当前位置
* @return 返回当前position的id
*/
@Override
public long getItemId(int position) {
return position;
}
/**
*处理view---data匹配过程
* @param position 当前位置
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//借用LayoutInflater来处理,并拿到自定义的每一个item的布局
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=layoutInflater.inflate(R.layout.item_layout,null);
ImageView imageView=(ImageView)convertView.findViewById(R.id.iv);
TextView textView=(TextView)convertView.findViewById(R.id.tv);
//将app的图标以及标题添加到自定义布局上
textView.setText(mApp.get(position).activityInfo.loadLabel(getPackageManager()));
imageView.setImageDrawable(mApp.get(position).activityInfo.loadIcon(getPackageManager()));
return convertView;
}
}
}
ListView的优化处理(其他文件相同)
package com.hala.view01;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
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 java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private ListView lv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.lv);
//将主页面的ListView与获取的手机信息绑定
final List<ResolveInfo> appInfos = getAppInfos();
lv.setAdapter(new AppListAdapter(appInfos));
//ListView的HeaderView属性
/*
这里实现的效果是顶部图片会随着滑动而动
如果要求顶部图片不动,可以在ListView上边加一个ImageView
*/
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View headerView=layoutInflater.inflate(R.layout.headerview_layout,null);
lv.addHeaderView(headerView);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//设置点击事件以实现跳转的效果
//这种方法是针对整个item设置的点击事件
String packageName=appInfos.get(position).activityInfo.packageName;
String className=appInfos.get(position).activityInfo.name;
ComponentName componentName=new ComponentName(packageName,className);
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
}
});
}
/**
* 获取用户的所有应用信息
* @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> mApp;
public AppListAdapter(List<ResolveInfo> appNames) {
mApp=appNames;
}
/**
*
* @return 一共有多少条数据
*/
@Override
public int getCount() {
return mApp.size();
}
/**
*
* @param position 当前位置
* @return 返回当前position的数据
*/
@Override
public Object getItem(int position) {
return mApp.get(position);
}
/**
*
* @param position 当前位置
* @return 返回当前position的id
*/
@Override
public long getItemId(int position) {
return position;
}
/**
*处理view---data匹配过程
* @param position 当前位置
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder=new ViewHolder();
/*
这里的优化之处在于:
只有在convertView为空时,才去借用LayoutInflater去调用布局
如果之前已经调用过了,就不在调用而是执行else的操作,这样大大提高了效率
*/
if(convertView==null) {
//借用LayoutInflater来处理,并拿到自定义的每一个item的布局
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.item_layout, null);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv);
viewHolder.textView = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
}else {
viewHolder=(ViewHolder)convertView.getTag();
}
//将app的图标以及标题添加到自定义布局上
viewHolder.textView.setText(mApp.get(position).activityInfo.loadLabel(getPackageManager()));
viewHolder.imageView.setImageDrawable(mApp.get(position).activityInfo.loadIcon(getPackageManager()));
return convertView;
}
}
//用于优化ListView
public class ViewHolder{
public ImageView imageView;
public TextView textView;
}
}
ListView与网络请求结合案例
配置文件 Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hala.view01">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
主页布局文件 activity_main.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="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@drawable/clarke"/>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"></ListView>
</LinearLayout>
每一项ListView的布局文件 item_layout.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/iv"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/timg"
/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="60dp"
android:paddingLeft="6dp"
android:textSize="20sp"
android:lines="1"
android:gravity="center_vertical" />
</LinearLayout>
添加在ListView底部图片的布局文件 headerview_layout.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">
<ImageView
android:layout_width="match_parent"
android:layout_height="240dp"
android:background="@drawable/conan"/>
</LinearLayout>
自定义Adapter文件 RequestDataAdapter.java
package com.hala.view01;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by air on 2018/2/8.
*/
public class RequestDataAdapter extends BaseAdapter{
private List<LessonResult.LessonInfo> mlessonInfo=new ArrayList<>();
private Context mcontext;
/**
*
* @param context 上下文
* @param infos 数据
*/
public RequestDataAdapter(Context context,List<LessonResult.LessonInfo> infos) {
mlessonInfo=infos;
mcontext=context;
}
@Override
public int getCount() {
return mlessonInfo.size();
}
@Override
public Object getItem(int position) {
return mlessonInfo.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder=new ViewHolder();
if(convertView==null){
LayoutInflater layoutInflater=(LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=layoutInflater.inflate(R.layout.item_layout,null);
viewHolder.imageView=(ImageView)convertView.findViewById(R.id.iv);
viewHolder.textView=(TextView)convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
}else {
viewHolder=(ViewHolder)convertView.getTag();
}
viewHolder.textView.setText(mlessonInfo.get(position).getName());
//设置图像为不可见
//注意GONE是消失的意思,图像将不在绘制,而INVISIBLE只是不可见,但仍然占据一块地方
viewHolder.imageView.setVisibility(View.GONE);
return convertView;
}
class ViewHolder {
public ImageView imageView;
public TextView textView;
}
}
主页面java文件 MainActivity.java
package com.hala.view01;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
import android.os.AsyncTask;
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 org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
public static final String STATUS = "status";
public static final String MSG = "msg";
public static final String DATA = "data";
public static final String NAME = "name";
public static final String REQUEST_URL = "http://www.imooc.com/api/teacher?type=2&page=1";
private ListView listView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.lv);
LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View footerView=layoutInflater.inflate(R.layout.headerview_layout,null);
listView.addFooterView(footerView);
new RequestDataAsyncTask().execute();
}
public class RequestDataAsyncTask extends AsyncTask<Void,Void,String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Void... params) {
return request(REQUEST_URL);
}
/**
* 从网络请求数据,在另一个线程中进行
* @param s
* @return
*/
private String request(String s) {
try {
URL url=new URL(s);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setConnectTimeout(30000);
connection.setRequestMethod("GET");
connection.connect();
int requestCode=connection.getResponseCode();
if(requestCode==HttpURLConnection.HTTP_OK){
InputStreamReader inputStream=new InputStreamReader(connection.getInputStream());
BufferedReader bufferReader=new BufferedReader(inputStream);
StringBuilder stringBuilder=new StringBuilder();
String line;
if((line=bufferReader.readLine())!=null){
stringBuilder.append(line);
}
return stringBuilder.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
LessonResult lessonResult=new LessonResult();
try {
JSONObject json=new JSONObject(s);
int status = json.getInt(STATUS);
lessonResult.setStatus(status);
String msg = json.getString(MSG);
lessonResult.setMsg(msg);
List<LessonResult.LessonInfo> lessonInfos=new ArrayList<>();
JSONArray dataArray=json.getJSONArray(DATA);
for(int i=0;i<dataArray.length();i++){
LessonResult.LessonInfo lessonInfo=new LessonResult.LessonInfo();
JSONObject temp=(JSONObject)dataArray.get(i);
String name = temp.getString(NAME);
lessonInfo.setName(name);
lessonInfos.add(lessonInfo);
}
lessonResult.setData(lessonInfos);
} catch (JSONException e) {
e.printStackTrace();
}
listView.setAdapter(new RequestDataAdapter(MainActivity.this,lessonResult.getData()));
}
}
}
显示结果