ListView问道

简介:

手机屏幕无法同时显示多项数据,此时是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;
    }
}

进阶

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容