簡體   English   中英

如何在android中以編程方式更新linearlayout子視圖?

[英]How to update linearlayout child view programmatically in android?

我已經以編程方式創建了linearylayout。 它有多行創建有白色背景。 現在,如果我單擊任何行,則只應更改該行的imageview圖標(應為綠色),其他行的imageview背景應更改為白色。 在android中是否有針對linearlayout的notifyDataSetChanged的任何替代。 下面是我的代碼。

for (int i = 0; i <= obj_tribe_info.al_ethnicity_secondary.size(); i++) {

            final int position = i;

            al_eth_bool.add(false);

            final LinearLayout ll_values = new LinearLayout(_activity);
            ll_values.setOrientation(LinearLayout.HORIZONTAL);
            ll_values.setGravity(Gravity.CENTER_VERTICAL);
            LayoutParams LLParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
            ll_values.setLayoutParams(LLParams);
            ll_values.setBackgroundResource(R.drawable.my_tribe_box_top);

            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            layoutParams.setMargins(50, 0, 0, 0);

            final ImageView iv_icon = new ImageView(_activity);
            if (al_eth_bool.get(position)) {
                iv_icon.setBackgroundResource(R.drawable.notify_onn);
            } else {
                iv_icon.setBackgroundResource(R.drawable.notify_off);
            }
            iv_icon.setLayoutParams(layoutParams);
            ll_values.addView(iv_icon);

            TextView tv_value = new TextView(_activity);
            tv_value.setTextColor(_activity.getResources().getColor(
                    R.color.black));
            tv_value.setLayoutParams(layoutParams);
            if (i == 0) {
                tv_value.setText(obj_tribe_info.str_ethnicity_primary);
            } else {
                tv_value.setText(obj_tribe_info.al_ethnicity_secondary
                        .get(i - 1).str_ethnicity_secondary);
            }
            ll_values.addView(tv_value);

            ll_ethnicity.post(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    ll_ethnicity.addView(ll_values);
                }
            });

            ll_values.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    if (al_eth_bool.get(position)) {
                        iv_icon.setBackgroundResource(R.drawable.notify_off);
                        al_eth_bool.set(position, false);
                    } else {
                        iv_icon.setBackgroundResource(R.drawable.notify_onn);
                        al_eth_bool.set(position, true);
                    }

                }
            });

        }

不,沒有替代notifyDataSetChanged() ,您必須手動通知您的ImageViews該更改。

一旦你有了改變,你可以像這樣迭代:

for(int i= 0; i < ll_ethnicity.getChildCount(); i++){
    ImageView iv = (ImageView) ((ViewGroup)ll_ethnicity.getChildAt(i)).getChildAt(0);
    // new background because something has changed
    // check if it's not the imageView you just clicked because you don't want to change its background
    iv.setBackground(...);
}

為了獲得更好的性能,您還可以使用ImageViews創建HashMap,然后根據需要訪問它以根據需要更改其中的一些。

我相信你正在尋找的是View.invalidate()方法。 它告訴應用程序該視圖不再正確,並且在可能的情況下將重繪它。 在onClick方法的末尾調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM