【问题标题】:How to Call Adapter class before Activity如何在活动之前调用适配器类
【发布时间】:2015-07-21 21:11:49
【问题描述】:

Log 说:

D/CartActivity-onCreate(18171): onCreate
D/CartActivity-TOTAL-InsideFORLOOP:(18171): 0.0
D/CartActivity-onResume(18171): onResume
D/CartAdapter-TOTAL:(18171): 12.95

如上图所示,for循环首先在 CartActivity 中执行,在 CartActivity 的 onResume() 方法执行后,CartAdapter 正在执行这一行,因此因为我在 For loop 内的 CartActivity 中将 0.0 作为 Total 的值

原因不是我要添加到数据 ArrayList 的位置,问题是 CartActivityCartAdapter 执行之前执行 (where i am getting value for Total) (where i am setting value for Total)

那么我必须做什么,如果我想在执行 CartActivity

onCreate() 方法之前想在下面调用
  CartArrayList.cartArraylist.get(position).setTotal(totalPrice);

CartActivity.java:

public class CartActivity extends Activity {
       .....

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("CartActivity-onCreate", "onCreate");            
        setContentView(R.layout.activity_cart);        

        .......
        adapter = new CartAdapter(getApplicationContext(), R.layout.adapter_cart, CartArrayList.cartArraylist);                                                                                
        for (int d = 0; d < CartArrayList.cartArraylist.size(); d++) {
            subTotal = subTotal + CartArrayList.cartArraylist.get(d).getTotal();
            Log.d("CartActivity-TOTAL-InsideFORLOOP:", String.valueOf(CartArrayList.cartArraylist.get(d).getTotal()));
        }
        listview.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        textSubTotal.setText(decimalFormat.format(subTotal));
    }

    @Override
    public void onResume() {
        super.onResume();  
        Log.d("CartActivity-onResume", "onResume");            
    }
}

CartAdapter.java:

public class CartAdapter extends BaseAdapter {

.....

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ......

    totalPrice = cart.getQuantity() * cart.getPrice();   
    CartArrayList.cartArraylist.get(position).setTotal(totalPrice);     
    Log.d("CartAdapter-TOTAL:", String.valueOf(CartArrayList.cartArraylist.get(position).getTotal()));      

    .....       

    return convertView;
}

}

【问题讨论】:

  • 但是你为什么在onCreate()里刷新呢?
  • 这是什么意思?如何刷新ArrayList
  • 您可能想在切换活动时尝试使用 onResume() 方法。 stackoverflow.com/questions/9776059/…
  • Oncreate() 只调用一次,而不是使用 onResume()
  • 我在这里寻找问题。有人可以告诉我? 在哪里吗,我的意思是我应该能够自己找到这句话和问题……还在寻找……

标签: android android-activity android-listview interface baseadapter


【解决方案1】:

您只需在Adapter中设置数组列表之前计算实体中的Total值,而不是在getView中计算它。

代码sn-p:

for (int d=0; d<CartArrayList.cartArraylist.size(); d++) {
   // calculate total value

   Double totalPrice = CartArrayList.cartArraylist.get(d).getQuantity() * CartArrayList.cartArraylist.get(d).getPrice();   
   CartArrayList.cartArraylist.get(d).setTotal(totalPrice);

   // set it for subTotal          
   subTotal = subTotal + totalPrice;                    
}

adapter = new CartAdapter(getApplicationContext(), R.layout.adapter_cart, CartArrayList.cartArraylist); 
listview.setAdapter(adapter);   

希望对你有所帮助ツ

【讨论】:

    【解决方案2】:

    您将希望将列表填充移动到 onResume(),最好将列表存储在 onSaveInstanceState() 的外部包中,然后检查它是否存在以在 onCreate() 中重新填充您的列表savedInstanceState 包。这与您的问题间接相关;)我知道,但是如果您将列表的人口和显示移动到 onResume() 您将还想做这些事情,这样您就不会重复您可能会做的工作已经完成了。

    另外,将 notifyDataSetChanged() 移到更新数据的位置之后。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);     
        listview = (ListView)findViewById(R.id.listCart);
        if (adapter == null) {
            adapter = new CartAdapter(getApplicationContext(), R.layout.adapter_cart, CartArrayList.cartArraylist);
        }
        listview.setAdapter(adapter);
        if (savedInstanceState != null) {
            CartArrayList.cartArrayList = savedInstanceState.getParcelableArrayList(KEY_BUNDLE_CART_LIST);
        }
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putParcelableArrayList(KEY_BUNDLE_CART_LIST, CartArrayList.cartArrayList);
        super.onSaveInstanceState(outState);
    }
    
    
    @Override
    public void onResume() {
        super.onResume();
        if (CartArrayList.cartArrayList.isEmpty()) {
            // Update your cartArrayList here if necessary
        }
        adapter.notifyDataSetChanged();
        for(int d=0; d<CartArrayList.cartArraylist.size(); d++) {
            subTotal = subTotal + CartArrayList.cartArraylist.get(d).getTotal();
            Log.d("NAME:", CartArrayList.cartArraylist.get(d).getName().toString());
            Log.d("QUANTITY:", String.valueOf(CartArrayList.cartArraylist.get(d).getQuantity()));
            Log.d("PRICE:", String.valueOf(CartArrayList.cartArraylist.get(d).getPrice()));
            Log.d("TOTAL:", String.valueOf(CartArrayList.cartArraylist.get(d).getTotal()));
            Log.d("SUM:", String.valueOf(subTotal));
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用以下代码

      _ListAdapter.notifyDataSetChanged();
      

      【讨论】:

        【解决方案4】:

        根据您的第一句话,我不确定,因为您在那里说过您在进入 CartActivity 之前添加了一个项目。我有点怀疑,或者你有并发问题。

        如果您的第一句话是真的,您添加购物车条目的 onClick 可能会在您的 onCreate 方法运行之后调用,这意味着您只有在第二次打开 CartActivity 时才能看到它。p>

        最大的问题是添加调用的时间。

        【讨论】:

        • 那你有什么建议?
        • 找出onClick和onCreate方法的顺序。
        【解决方案5】:

        该值不会自动反映。您必须调用 adapter.notifyDataSetChanged();更新数据集后。

        【讨论】:

        • 为什么要发布重复的答案?
        • 我没有发布重复的答案。我正在写,同时你已经发布了。
        猜你喜欢
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-07
        相关资源
        最近更新 更多