Android:不使用布局文件,为Listview填充数据

因为多人开发,为了是自己开发的模块方便融合到主框架中,同时也为了减小apk的大小,要求尽可能少的使用xml的布局文件,开发中需要在ListView中显示数据,网上查到的几乎所有的示例,都是通过xml文件来为ListView的Item提供布局样式,甚是不方便。

能不能将自己通过代码创建的布局(如View,LinearLayout)等动态的布局到ListView呢?当然可以。

为了给ListView提供数据,我们需要为其设置一个适配,我们可以从BaseAdapter继承,然后重写它的getView方法,这个方法中有一个参数convertView,我们可以将它设置为我们自定义的视图并返回,来实现加载用代码定义好的布局。

定义一个LinearLayout布局,它是继承自View的,所以可以通过getView返回(注意:不要为这个布局使用 LinearLayout.LayoutParams 参数,因为ListView不识别,他识别的是AbsListView LayoutParams

代码如下:

public class PriceBoard extends LinearLayout {
    private ListView listView;
    private List items;
    private LinearLayout.LayoutParams params;
    public PriceBoard(Context context, AttributeSet attrs) {
        super(context, attrs);
        items = new ArrayList();
        this.setOrientation(HORIZONTAL);
        params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        listView = new ListView(context);
        listView.setLayoutParams(params);
        PriceBoardAdapter priceBoardAdapter = new PriceBoardAdapter(context);
        listView.setAdapter(priceBoardAdapter);
        addView(listView, params);
    }
    public void add(PriceData data){
        PriceBoardItem item = new PriceBoardItem(this.getContext(),null);
        item.setItem(data);
        items.add(item);
        params.setMargins(10,0,0,2);
//        item.setLayoutParams(params);
    }
    public PriceBoardItem getItemView(int index){
        return (PriceBoardItem)items.get(index);
    }
    private class PriceBoardItem extends LinearLayout{
        private TextView nameView;
        private TextView enCodeView;
        private TextView priceView;
        private PriceData priceData;
        public PriceBoardItem(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.setOrientation(HORIZONTAL);
            nameView = new TextView(context);
            nameView.setTextSize(TypedValue.COMPLEX_UNIT_PX,38);
            enCodeView = new TextView(context);
            enCodeView.setTextSize(TypedValue.COMPLEX_UNIT_PX,28);
            priceView = new TextView(context);
            priceView.setTextSize(TypedValue.COMPLEX_UNIT_PX,48);
            priceView.setGravity(Gravity.CENTER);
            setLayout();
        }
        public TextView getNameView(){
            return nameView;
        }
        public TextView getEnCodeView(){
            return enCodeView;
        }
        public TextView getPriceView(){
            return priceView;
        }
        public PriceData getPriceData(){
            return priceData;
        }
        private void setLayout(){
            LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT,1);
            LinearLayout linearLayout = new LinearLayout(getContext());
            linearLayout.setOrientation(VERTICAL);
            linearLayout.addView(nameView,p);
            linearLayout.addView(enCodeView,p);
            addView(linearLayout, p);

            p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT,1);
            linearLayout = new LinearLayout(getContext());
            linearLayout.setOrientation(VERTICAL);
            linearLayout.addView(priceView,p);
            addView(linearLayout, p);
        }
        public void setItem(PriceData data){
            priceData = data;
        }
    }
    private class PriceBoardAdapter extends BaseAdapter{
        private Context _context;
        public PriceBoardAdapter(Context context){
            _context = context;
        }
        public int getCount(){
            return items.size();
        }
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            PriceBoardItem view = getItemView(position);
            PriceData data = ((PriceBoardItem) items.get(position)).getPriceData();
            view.getNameView().setText(data.getName());
            view.getEnCodeView().setText(data.getEnCode());
            view.getPriceView().setText(String.valueOf(data.getPrice()));
            convertView = view;
            return convertView;
        }
    }

调用:

        PriceBoard priceBoard = new PriceBoard(context,null);
        priceData = new PriceData();
        priceData.setName("现货白银");
        priceData.setEnCode("Ag");
        priceData.setPrice(4006);
        priceBoard.add(priceData);
        priceData = new PriceData();
        priceData.setName("现货铜");
        priceData.setEnCode("Cu");
        priceData.setPrice(43895);
        priceBoard.add(priceData);
        priceData = new PriceData();
        priceData.setName("现货镍");
        priceData.setEnCode("Ni");
        priceData.setPrice(43895);
        priceBoard.add(priceData);
        addView(priceBoard);

效果:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bdmh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值