前言
Android控件ListView学习笔记
添加ListView控件
/app/src/main/res/layout/activity_main.xml
1 2 3 4 5 6 7 8 9 10 11
| <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="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
|
自定义一个布局
- 创建一个布局
list_item.xml
,用于存放列表内的元素
/app/src/main/res/layout/list_item.xml
1 2 3 4 5 6 7 8 9 10
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
|
创建一个Bean类
/app/src/main/java/…/Bean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Bean {
private String name;
public Bean(String name) { this.name = name; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
|
创建一个适配器类
- 创建一个适配器类,继承BaseAdapter类,用于把列表中元素放到列表中
/app/src/main/java/…/MyAdapter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public class MyAdapter extends BaseAdapter {
private List<Bean> beans; private Context context;
public MyAdapter(List<Bean> beans, Context context) { this.beans = beans; this.context = context; }
@Override public int getCount() { return beans.size(); }
@Override public Object getItem(int i) { return null; }
@Override public long getItemId(int i) { return i; }
@Override public View getView(int i, View view, ViewGroup viewGroup) { if (view == null) { view = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false); } TextView textView = view.findViewById(R.id.tv); textView.setText(beans.get(i).getName()); return view; } }
|
优化(可选)
- 由于findViewById()大量耗时,所以可以创建一个viewHolder对象,用于存储findViewById()获取后的对象
- 此时当列表元素未被findViewById()获取过时,立即使用findViewById()获取对象,并将获取的对象存入viewHoler
- 此时当列表元素已被findViewById()获取过时,直接获取viewHolder对象中存储的对象
/app/src/main/java/…/MyAdapter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; if (view == null) { viewHolder = new ViewHolder(); view = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false); viewHolder.textView = view.findViewById(R.id.tv); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } viewHolder.textView.setText(beans.get(i).getName()); return view; }
private final class ViewHolder { TextView textView; }
|
实例化对象
- 在主类中创建列表元素对象,并通过自定义的适配器,将列表元素渲染到列表中
/app/src/main/java/…/MyActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class MainActivity extends AppCompatActivity {
private List<Bean> beans = new ArrayList<>();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
beans.add(new Bean("文本内容")); ... ListView listView = findViewById(R.id.lv); listView.setAdapter(new MyAdapter(beans, this));
} }
|
为列表元素添加点击方法
/app/src/main/java/…/MyActivity.java
1 2 3 4 5 6 7
| listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { System.out.println(i); } });
|
完成
参考文献
哔哩哔哩——Android架构解析