ListView问道

简介:

手机屏幕无法同时显示多项数据,此时是ListView用武之地,该控件用于在有限的窗口,中显示大量的数据集。回想一下,手机App中类似新浪微博今日头条等, 主界面的效果和ListView别无二致。

接触 ListView

  • ArrayAdapter - 继承于 BaseAdapter, 用于从给定数据集中抽取指定对象,提供给 ListView 显示
  • android.R.layout.simple_list_item_1 - SDK 内置的layout文件, 组件为一个 TextView
Demo
  • XML - 在主 Layout 中添加 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


    

    

  • FruitAdapter
public class FruitAdpter extends ArrayAdapter {
    private int resId;

    public FruitAdpter(@NonNull Context context, @LayoutRes int resource, List 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 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 mDatas;

    public FruitBaseAdapter(Context context, List 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;
    }
}

进阶

  • hongyang 博客
    http://blog.csdn.net/lmj623565791/article/details/38902805

你可能感兴趣的:(ListView问道)