【安卓】ListView笔记

目录

目录

1. 初始化一个ListView以及创建其Adapter

2. 简单的数据展示

3. 优化

3.1 如何动态的改变数据?/ 把Adapter中写死的数据抽象出一个对象

3.2 ItemView内容的丰富

3.3 ListView中Item的点击和长按事件

3.4 如何更新ListView中的数据。

3.5 重用视图

3.6 Item不同怎么办?

3.7 聊天列表(左右) 怎么做?

3.8 常用属性


 


1. 初始化一个ListView以及创建其Adapter

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:ignore="MissingConstraints">
    </ListView>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity:

public class MainActivity extends AppCompatActivity {

    ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 找到listView
        listView = (ListView)findViewById(R.id.listview);

        //为listView添加Adapter
        ListViewAdapter listViewAdapter = new ListViewAdapter();
        listView.setAdapter(listViewAdapter);
    }
}

创建的Adapter:

public class ListViewAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        // 有多少条数据
        return 0;
    }

    @Override
    public Object getItem(int position) {
        // 找到哪一条数据
        return null;
    }

    @Override
    public long getItemId(int position) {
        // 找到数据的id
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 返回一个视图。position:那个视图 convertView:视图  parent: 属于谁
        return null;
    }
}

2. 简单的数据展示

public class ListViewAdapter extends BaseAdapter {
    // 上下文 全局变量
    private Context mContext;
    // 布局解析器
    private LayoutInflater mLayoutInflater;
    // 数据
    private String[] mNames = {"name1","name2"};

    // 构造器
    public ListViewAdapter(Context context){
        mContext = context;
        // 初始化这个视图解析器服务
        mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        // 有多少条数据
        return mNames.length;
    }

    @Override
    public Object getItem(int position) {
        // 找到哪一条数据
        return mNames[position];
    }

    @Override
    public long getItemId(int position) {
        // 找到数据的id
        return position;
    }

    @SuppressLint("ViewHolder")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 返回一个视图。position:那个视图 convertView:视图  parent: 属于谁

        convertView = mLayoutInflater.inflate(R.layout.item_layout,null);

        // 在试图中找到TextView
        TextView textView = (TextView) convertView.findViewById(R.id.item_textview);
        textView.setText(mNames[position]);
        return convertView;
    }
}

3. 优化

3.1 如何动态的改变数据?/ 把Adapter中写死的数据抽象出一个对象

改写adapter:

public class ListViewAdapter extends BaseAdapter {
    // 上下文 全局变量
    private Context mContext;
    // 布局解析器
    private LayoutInflater mLayoutInflater;
    // 数据
    private List<UserInfo> mUserInfos= new ArrayList();

    // 构造器
    public ListViewAdapter(Context context, List<UserInfo> mUserInfos){
        mContext = context;
        this.mUserInfos = mUserInfos;
        // 初始化这个视图解析器服务
        mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        // 有多少条数据
        return mUserInfos.size();
    }

    @Override
    public Object getItem(int position) {
        // 找到哪一条数据
        return mUserInfos.get(position);
    }

    @Override
    public long getItemId(int position) {
        // 找到数据的id
        return position;
    }

    @SuppressLint("ViewHolder")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 返回一个视图。position:那个视图 convertView:视图  parent: 属于谁

        convertView = mLayoutInflater.inflate(R.layout.item_layout,null);

        // 在试图中找到TextView
        TextView textView = (TextView) convertView.findViewById(R.id.item_textview);
        textView.setText(mUserInfos.get(position).getName());
        return convertView;
    }
}

在MainActivity中创建数据并传给adapter

public class MainActivity extends AppCompatActivity {

    ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 找到listView
        listView = (ListView)findViewById(R.id.listview);

        // 创建数据
        List<UserInfo> userInfoList = new ArrayList<>();
        userInfoList.add(new UserInfo("张三"));
        userInfoList.add(new UserInfo("李四"));

        //为listView添加Adapter
        ListViewAdapter listViewAdapter = new ListViewAdapter(MainActivity.this,userInfoList);
        listView.setAdapter(listViewAdapter);
    }
}

创建的UserInfo.java

public class UserInfo {
    private String name;

    public UserInfo(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.2 ItemView内容的丰富

3.3 ListView中Item的点击和长按事件

事件是发生在item上的,但是要加在ListView上,加的是setOnItemClickListener

public class MainActivity extends AppCompatActivity {

    ListView listView;
    private final List<UserInfo> userInfoList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 找到listView
        listView = (ListView)findViewById(R.id.listview);

        // 创建数据
        userInfoList.add(new UserInfo("张三"));
        userInfoList.add(new UserInfo("李四"));

        //为listView添加Adapter
        ListViewAdapter listViewAdapter = new ListViewAdapter(MainActivity.this, userInfoList);
        listView.setAdapter(listViewAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // view:Adapter中getView返回的view,position:位置 id:id
                Toast.makeText(MainActivity.this,userInfoList.get(position).getName() +"被点击了",Toast.LENGTH_LONG).show();
            }
        });
    }
}

长按事件同理。

3.4 如何更新ListView中的数据。

添加新的数据 / 让列表显示别的数据:

使用这个方法即可:

listViewAdapter.notifyDataSetChanged();

不要为数据创建新的Adapter,也不用重新为listview绑定adapter。只需重新刷新数据即可,

3.5 重用视图

在之前的代码中,每次获得item 的view的时候,都会用解析器去拿视图,然而这些item的view都是一样的。

改进:

if (convertView == null) {
    convertView = mLayoutInflater.inflate(R.layout.item_layout, null);
}

3.6 Item不同怎么办?

3.7 聊天列表(左右) 怎么做?

3.8 常用属性

猜你喜欢

转载自blog.csdn.net/weixin_44284276/article/details/115425241