ListView+自定义Adapter实现简单的好友列表

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

最终效果


猜你喜欢

转载自blog.csdn.net/moty12/article/details/80895461