简介:
手机屏幕无法同时显示多项数据,此时是ListView用武之地,该控件用于在有限的窗口,中显示大量的数据集。回想一下,手机App中类似新浪微博,今日头条等, 主界面的效果和ListView别无二致。
接触 ListView
- ArrayAdapter - 继承于 BaseAdapter, 用于从给定数据集中抽取指定对象,提供给 ListView 显示
- android.R.layout.simple_list_item_1 - SDK 内置的layout文件, 组件为一个 TextView
Demo
- XML - 在主 Layout 中添加 ListView
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:id="@+id/list_view">
</ListView>
- Activity
public class MainActivity extends AppCompatActivity {
private String[] fruits = {"Apple", "Apple", "Banana", "Banana", "Grape", "Grape",
"Pineapple", "Pineapple", "Mango", "Mango", "Strawberry", "Strawberry"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView mListView = (ListView)findViewById(R.id.list_view);
//为 ListView 设置数据适配器
mListView.setAdapter(new ArrayAdapter<>(
MainActivity.this, android.R.layout.simple_list_item_1, fruits
));
}
}
自定义 ListView
ArrayAdapter Demo
- XML - 在 res/layout 目录添加 fruit_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fruit_image"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fruit_name"
android:layout_gravity="center"
android:layout_marginLeft="10dp"/>
</LinearLayout>
- FruitAdapter
public class FruitAdpter extends ArrayAdapter {
private int resId;
public FruitAdpter(@NonNull Context context, @LayoutRes int resource, List<Fruit> objects) {
super(context, resource, objects);
resId = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Fruit fruit = (Fruit) getItem(position);
ViewHolder viewHolder = null;
if (convertView == null) {
//convertView实现listView的缓存机制
convertView = LayoutInflater.from(getContext()).inflate(resId, null);
viewHolder = new ViewHolder();
viewHolder.imageView = convertView.findViewById(R.id.fruit_image);
viewHolder.textView = convertView.findViewById(R.id.fruit_name);
//convertView持有viewHolder,当convertView复用时,不用再次通过findViewById寻找组件
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder)convertView.getTag();
}
//将数据载入对应组件
viewHolder.imageView.setImageResource(fruit.getImageId());
viewHolder.textView.setText(fruit.getName());
return convertView;
}
class ViewHolder{
public ImageView imageView;
public TextView textView;
}
}
- Activity
public class MainActivity extends AppCompatActivity {
private List<Fruit> fruits = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFruits();
ListView mListView = (ListView)findViewById(R.id.list_view);
mListView.setAdapter(new FruitAdpter(
MainActivity.this, R.layout.fruit_item, fruits
));
}
//目的在于学习 ListView,图片用内置的 ic_launcher
private void initFruits(){
fruits.add(new Fruit(R.mipmap.ic_launcher, "Apple"));
fruits.add(new Fruit(R.mipmap.ic_launcher, "Banana"));
fruits.add(new Fruit(R.mipmap.ic_launcher, "Grape"));
fruits.add(new Fruit(R.mipmap.ic_launcher, "Mango"));
fruits.add(new Fruit(R.mipmap.ic_launcher, "Strawberry"));
}
}
BaseAdapter Demo
- FruitBaseAdapter
public class FruitBaseAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Context mContext;
private List<Fruit> mDatas;
public FruitBaseAdapter(Context context, List<Fruit> items){
mInflater = LayoutInflater.from(context);
mContext = context;
mDatas = items;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
if (view == null){
view = mInflater.inflate(R.layout.fruit_item, viewGroup, false);
viewHolder = new ViewHolder();
viewHolder.imageView = view.findViewById(R.id.fruit_image);
viewHolder.textView = view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder)view.getTag();
}
viewHolder.imageView.setImageResource(((Fruit)getItem(i)).getImageId());
viewHolder.textView.setText(((Fruit)getItem(i)).getName());
return view;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public Object getItem(int i) {
return mDatas.get(i);
}
@Override
public int getCount() {
return mDatas.size();
}
class ViewHolder{
ImageView imageView;
TextView textView;
}
}