1

프로그래밍 방식으로 선형 레이아웃을 만들었습니다. 흰색 배경을 가진 여러 행이 만들어집니다. 이제 행을 클릭하면 해당 행의 이미지 뷰 아이콘 만 변경되고 (녹색이어야 함) 다른 행의 이미지 뷰 배경은 흰색으로 변경되어야합니다. 안드로이드에서 linearlayout에 대한 notifyDataSetChanged의 위치가 있습니까? 아래 코드는 내 코드입니다.안드로이드에서 linearlayout 자식 뷰를 프로그래밍 방식으로 업데이트하는 방법은 무엇입니까?

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); 
        } 

       } 
      }); 

     } 

답변

3

아니요, 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을 만들 수 있습니다를 .

+0

getChildAt (0)에서 오류가 발생했습니다. ImageView에서 iv = (ImageView) ll_ethnicity.getChildAt (i) .getChildAt (0); – rahul

+0

예, 저의 예는 매우 기초적이었습니다. ll_ethnicity.getChildAt (i)를 ViewGroup 또는 LinearLayout으로 체크/캐스트해야합니다. 내 게시물을 편집합니다 – JimmyVanBraun

+0

내 시간을 저장 :) – rahul

0

나는 당신이 찾고있는 것이 View.invalidate() 방법이라고 생각합니다. 이 뷰는 더 이상 올바르지 않다는 것을 응용 프로그램에 알리고 가능한 경우 다시 그려집니다. onClick 메서드가 끝날 때이 메서드를 호출하십시오.

관련 문제