android小白,用于总结自己学的知识。
参考书目:郭霖《第一行代码》
1.创建列表项布局
这里就简单的实现头像和名字的布局。
list_item.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/friend_image"
android:layout_width="70dp"
android:layout_height="70dp" />
<TextView
android:id="@+id/friend_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
2.在主界面添加LView
activity_main.xml
<ListView
android:id="@+id/myListView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
3.创建一个实体类Friends
Friends.java
public class Friends {
private String name;//好友名
private int imageId;//好友头像资源id
public Friends(String name, int imageId) {
this.name = name;
this.imageId = imageId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImageId() {
return imageId;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
}
4.自定义适配器,继承BaseAdapter
FriendAdapter.java
public class FriendAdapter extends BaseAdapter {
private Context context;
private List<Friends> list; //定义数据源
private int resourceId; //定义布局资源Id
private ViewHolder viewHolder = null;
public FriendAdapter(Context context,List<Friends> list,int resourceId){
this.context = context;
this.list = list;
this.resourceId = resourceId;
}
@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 view, ViewGroup viewGroup) {
if(view ==null){
view = LayoutInflater.from(context).inflate(resourceId,null);
viewHolder = new ViewHolder();
viewHolder.friendImage = (ImageView) view.findViewById(R.id.friend_image);
viewHolder.friendName = (TextView) view.findViewById(R.id.friend_name);
view.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.friendImage.setImageResource(list.get(position).getImageId());
viewHolder.friendName.setText(list.get(position).getName());
return view;
}
class ViewHolder{
ImageView friendImage;
TextView friendName;
}
}
创建ViewHolder是为了对控件经行缓存,当ListView快速滚动时,不必每次都重新创建对象。getView()中的view(convertView)参数,这个参数用于将之前加载好的布局进行缓存,所以对view进行判断,如果为空,则创建一个ViewHolder对象,并将控件实例都存放在ViewHolder中,然后调用View的setTag()方法,将ViewHolder对象存储在View中。当view不为空时,则调用View的getTag()方法,把ViewHolder重新取出。
ViewHolder和getView的判断都是为了提高listview的性能。提高listview的运行效率。
5.修改MainActivity,java中的代码
public class MainActivity extends AppCompatActivity {
private List<Friends> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
FriendAdapter friendAdapter = new FriendAdapter(MainActivity.this,list,R.layout.list_item);
ListView listView = (ListView)findViewById(R.id.myListView);
listView.setAdapter(friendAdapter);
}
/**
* 添加10条数据
*/
private void initData() {
for (int i =0; i<10;i++){
Friends f1 = new Friends("张三",R.drawable.person);
list.add(f1);
}
}
}
最终效果