繁体   English   中英

BaseAdapter和Fragment之间的通信

[英]Communication between BaseAdapter and Fragment

首先,我知道这里已经回答了这个问题: fragment和baseadapter之间的Android通信 ,我尝试实现它,但是由于这是我第一次使用接口,并且没有得到其背后的逻辑,因此无法正常工作。 我的问题是我想设置此片段的TextView的值

Fragment.java

public class FragmentCart extends Fragment {
    private TextView totalTxt;
    private TextView totalItems;
    private ListView itemList;

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_cart, container, false);
        totalTxt = (TextView)view.findViewById(R.id.totalTxt);
        totalItems = (TextView)view.findViewById(R.id.totalItems);
        itemList = (ListView)view.findViewById(R.id.itemList);
        itemList.setAdapter(MainActivity.cart);
        return view;
    }
}

这个适配器的值(double totalCost)

Adapter.java

public class Cart extends BaseAdapter {
    private double totalCost = 0;

    public getView() {
        Item item.....
        totalCost += item.getPrice();
    }
}

逻辑是,当我将项目添加到购物车(适配器)时,片段中的TextView也将更新。 如何使用界面执行此操作?

要直接回答您的问题:

Adapter.java中,声明一个新接口,我们将其称为TotalCostUpdater

public interface TotalCostUpdater {
    void onTotalCostUpdated(int totalCost);
}

然后,仍然在适配器中,您需要一个通过构造函数初始化实现此接口的字段。 更新值后,可以从此处调用onTotalCostUpdated(totalCost)

您的Adapter.java类将如下所示:

public class Cart extends BaseAdapter 
{

    public interface TotalCostUpdater {
        void onTotalCostUpdated(int totalCost);
    }

    private double totalCost = 0;

    private TotalCostUpdater costUpdater;

    public Cart(TotalCostUpdater costUpdater) {
        this.costUpdater = costUpdater;
    }

    public getView() 
    {
        Item item.....
        totalCost += item.getPrice();
        costUpdater.onTotalCostUpdated(totalCost);
    }
}

然后,您需要实现TotalCostUpdater ,并在FragmentCart.java中重写其onTotalCostUpdated方法:

public class FragmentCart extends Fragment implements Cart.TotalCostUpdater 
{
    private TextView totalTxt;
    private TextView totalItems;
    private ListView itemList;

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    {
        View view = inflater.inflate(R.layout.fragment_cart, container, false);
        totalTxt = (TextView)view.findViewById(R.id.totalTxt);
        totalItems = (TextView)view.findViewById(R.id.totalItems);
        itemList = (ListView)view.findViewById(R.id.itemList);
        itemList.setAdapter(MainActivity.cart);
        return view;
    }

    @Override
    public void onTotalCostUpdated(int totalCost) {
        totalTxt.setText(totalCost);
    }
}

实例化适配器时(有时必须编写一个new Cart() ),您需要传入FragmentCart ,它现在正在实现Cart的构造函数中预期的接口:

new Cart(fragmentCart);

这应该可以解决问题。 这是您应该考虑的其他一些事项:

  • 适配器应该是保存数据的适配器,而应该有一个CartData类保存实际的购物车值。
  • 该适配器似乎对您的MainActivity.cart是全局的。 您应该直接在Fragment类中实例化它
  • 您应该使用ButterKnife lib摆脱所有的findViewById调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM