Android巧妙运用java 多态的特性,一个布局适配不同的数据结构

本文探讨了如何利用Java的多态特性来优化Android开发中的列表适配问题。当需要展示不同数据结构但格式相同的列表时,传统方法可能导致代码冗余。通过创建接口和实现多态,可以避免类型判断,实现更简洁高效的适配器代码,提高代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于java的多态特性,只要是做java的,大家就算没用过,也绝对听过,因为这是java的基本特性。java的多态特性,既然存在,就有其价值。

举个真实的例子:

作为一名Android开发,有时候会遇到这样的产品需求,如下


都是列表形式展现,下面是列表的展现形式,格式都一样,只是接口请求的数据不同,展现形式相同。



作为一个Android开发,如果是最简单的做法:

列如:请求api1获得List<Order> api2获得List<Express>

对每个list分别写一个适配器,代码就不写了,很简单,但是代码冗余,明明是一个的格式,只是因为接口字段不同,只是因为不同的bean,导致需要写2个适配器,这是多么痛苦的事情。


我们可以在简化一下,上述代码太冗余,使用泛型去适配不同的bean类,代码如下

Order.Class

public class Order {
    private String name;

    public Order(String name) {
        this.name = name;
    }

    public String getName() {
        return name;

    }

    public void setName(String name) {
        this.name = name;
    }
}

Express.Class

public class Express {

    private String name;

    public String getName() {
        return name;
    }

    public Express(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

ListAdapter.Class
public class ListAdapter<T> extends BaseAdapter {
    List<T> list;


    public ListAdapter(Context context, List<T> list) {
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //do something
        T t = list.get(position);
        if (t instanceof Express) {
            // TODO: 2017/7/26  显示订单
        } else if (t instanceof Order) {
            // TODO: 2017/7/26 显示运费
        }
        //do something
        return convertView;
    }
}


但是这种方式我们还要通过判断类型去适配,试问有没有连类型都不用判断的方法,直接显示,获取就显示,这样该多方便啊!然而  我们的确有这种方法可以处理,那就需要运用到java的多态特性。代码如下:

首先新建一个接口

public interface ICommon {
    String getCommonName();

    void setCommonName(String name);

}
还是之前的Order.Class 和 Express.Class ,不同之前在于,现在这2个类都要实现上面的ICommon接口并做一些处理:
public class Express implements ICommon {

    private String name;

    public String getName() {
        return name;
    }

    public Express(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getCommonName() {//注意这里,重写的方法里面加入本类的get方法
        return getName();
    }

    @Override
    public void setCommonName(String name) {
        setName(name);
    }
}
public class Order implements ICommon{
    private String name;

    public Order(String name) {
        this.name = name;
    }

    public String getName() {
        return name;

    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getCommonName() {
        return getName();
    }

    @Override
    public void setCommonName(String name) {
        setName(name);
    }
}

最精彩的就是在适配器里面:
public class ListAdapter extends BaseAdapter {
    List<ICommon> list;


    public ListAdapter(Context context, List<ICommon> list) {
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //do something
        ICommon iCommon = list.get(position);
        //name指代订单名称或者快递名称
       name.setText(iCommon.getCommonName());//运用多态的特性,获取到实现的子类的属性值
        //do something
        return convertView;
    }

}
最后调用适配器的时候:
   //运费列表是适配
        Express express = new Express("快递");
        List<Express> expressesList = new ArrayList<>();
        expressesList.add(express);
        expressesList.add(express);
        expressesList.add(express);
        expressesList.add(express);
        expressesList.add(express);
        ListAdapter listAdapter = new ListAdapter(this, expressesList);
        listView.setAdapter(listAdapter);
        
        //订单列表的适配
        Order order= new Order("订单");
        List<Order> orderList = new ArrayList<>();
        orderList.add(order);
        orderList.add(order);
        orderList.add(order);
        orderList.add(order);
        orderList.add(order);
        ListAdapter listAdapter = new ListAdapter(this, orderList);
        listView.setAdapter(listAdapter);

大功告成,如此一来我们不用为了一些相同的布局但是不同的 数据结构而造成的麻烦而被困扰,或者浪费时间。

好的代码都是一遍遍提炼出来的,巧妙运用的话 ,真的会使代码更上一个层次,对于自己也是一次新的超越!








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值