2017-04-12 1 views
0

행에 뷰가있는 사용자 정의 BaseAdapter가 있습니다.
주로 체크 박스 (ImageView) 및 버튼 (ImageView) 및 숨겨진 텍스트 (TextView).
체크 상자를 클릭 할 때마다 드로어 블을 변경하고 작동하는 것처럼 보이지만, 오직 notifyDataSetChanged - IMO는 중요하지 않습니다. 선을 제거하면 때때로 작동하고 때로는 작동하지 않습니다.
더 중요한 부분은 holder.expansion을 표시하거나 숨기려면 버튼을 원하지만 작동하지 않습니다. 에 관계없이 v.getTag() 나는 또한 holder.expansion을 사용하려고 시도했으나 작동하지 않았다.OnClickListener가 사용자 정의 BaseAdapter에서 뷰를 변경하지 않습니다.

어떻게 작동시킬 수 있습니까? 체크 박스 drawable을 변경하고 확장 텍스트를 표시/숨기려면? 내가이 만든 변경 사항의 제안에 따르면

@Override 
public View getView(int position, View view, ViewGroup parent) 
{ 
    final DrugHolder holder; 
    if (view == null) 
    { 
     holder = new DrugHolder(); 
     view = inflater.inflate(R.layout.drug_list_row, null); 
     holder.name = (TextView) view.findViewById(R.id.drug_list_name); 
     holder.checkbox = (ImageView) view.findViewById(R.id.drug_list_checkbox); 
     holder.arrow = (LinearLayout) view.findViewById(R.id.drug_list_arrow_button); 
     holder.expansion = (LinearLayout) view.findViewById(R.id.drug_list_expansion); 
     holder.fullName = (TextView) view.findViewById(R.id.drug_list_full_name); 
     holder.quantity = (TextView) view.findViewById(R.id.drug_list_quantity); 
     holder.unitDose = (TextView) view.findViewById(R.id.drug_list_unit_dose); 

     view.setTag(holder); 
    } 
    else 
    { 
     holder = (DrugHolder) view.getTag(); 
    } 
    int colorPos = position % colors.length; 
    view.setBackgroundColor(colors[colorPos]); 

    Drug drug = allItems.get(position); 
    holder.name.setText(drug.Name); 
    holder.fullName.setText(drug.Name); 
    holder.quantity.setText(String.format(Locale.GERMANY, "%.2f", drug.Quantity)); 
    holder.unitDose.setText(drug.DoseType); 
    holder.arrow.setTag(holder.expansion); 

    holder.checkbox.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      ImageView view = (ImageView) v; 
      if (view.isSelected()) 
      { 
       view.setSelected(false); 
       view.setImageDrawable(context.getDrawable(R.drawable.ic_icon_checkbox_unchecked)); 
      } 
      else 
      { 
       view.setSelected(true); 
       view.setImageDrawable(context.getDrawable(R.drawable.ic_icon_checkbox_checked)); 
      } 
      notifyDataSetChanged(); 
     } 
    }); 

    holder.arrow.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      LinearLayout view = (LinearLayout) v.getTag(); 
      if (view.getVisibility() == View.VISIBLE) 
      { 
       view.setVisibility(View.GONE); 
      } 
      else 
      { 
       view.setVisibility(View.VISIBLE); 
      } 
      notifyDataSetChanged(); 
     } 
    }); 

    return view; 
} 

:

if (drug.isChecked()) //Here breakpoint - enters only when entering activity 
    { 
     holder.checkbox.setImageDrawable(context.getDrawable(R.drawable.ic_icon_checkbox_checked)); 
    } 
    else 
    { 
     holder.checkbox.setImageDrawable(context.getDrawable(R.drawable.ic_icon_checkbox_unchecked)); 
    } 
    if (drug.isExpanded()) 
    { 
     holder.fullName.setVisibility(View.VISIBLE); 
    } 
    else 
    { 
     holder.fullName.setVisibility(View.GONE); 
    } 

    holder.checkbox.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      drug.setChecked(!drug.isChecked()); // Breakpoint - enters when clicks 
      notifyDataSetChanged(); // After F8 goes to this line but never goes to getView again 
     } 
    }); 

    holder.arrow.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      drug.setExpanded(!drug.isExpanded()); // Breakpoint - enters when click 
      notifyDataSetChanged(); // Never goes to this line after F8 - instead it jumps to View.java and shows red block with 'Source code does not match byte code 
     } 
    }); 

답변

2

당신은 확인 상태에 대한 약물의 정보를 저장하고 당신이보기에 데이터를 설정할 때이 상태를 확인해야합니다. 예를 들어

if (drug.isChecked()) { 
holder.checkbox.setImageDrawable(context.getDrawable(R.drawable.ic_icon_checkbox_checked)); 
} else { 
holder.checkbox.setImageDrawable(context.getDrawable(R.drawable.ic_icon_checkbox_unchecked)); 
} 
+2

예, ListBox 항목의 CheckBox 이미지를 설정하려면이 값을 삽입해야합니다. 클릭 한 후 CheckBox 이미지를 설정하려면 onClick 메서드 내부에 삽입하고 다음으로 변경해야합니다 : drug.setChecked (! drug.isChecked()) 그리고 위의 코드. – Alexandre

+0

확장 표시와 동일합니까? 이 경우 notifyDataSetChanged()를 실행해야합니다. –

+0

리스너에서 마약에서 setChecked를 호출하고 notifyDataSetChanged를 호출하십시오 –

관련 문제