目录
3.1 如何动态的改变数据?/ 把Adapter中写死的数据抽象出一个对象
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);
}