2016-04-02 30 views
0

Listeden her bir obiect için textView oluşturan ve bunları doğrusal düzende ekleyen "her" için bir döngüye sahibim. Harika çalışıyor. Sonra kullanıcı geçiş düğmesine tıkladığında tüm textViews gizlemek istiyorum ama burada sorunum var - sadece son textView listeden gizli, geri kalanı hala görülebilir. Bu sorunu birçok çözümle çözmeye çalıştım (örneğin getChild() ile), ancak hiçbir şey işe yaramıyor. her yineleme için geçerli iteraton oluşturulan TextView görünürlüğünü değiştirir yeni dinleyici ayarlayın böylece - sen for döngüsü içinde textLine için bir dinleyici ayarıDinamik olarak metin ekleme ve gizleme Görünümler

final List<FilterItem> filterItemList = filterData.getFilterItemList(); 
for (FilterItem filterItem : filterItemList) { 
    final TextView filter = new TextView(MainPanelActivity.this); 
    filter.setText(filterItem.getFilterItemName()); 
    filter.setTextColor(R.color.black); 
    linearLayout.addView(filter); 
    filter.setVisibility(View.GONE); 
    textLine.setOnCheckedChangeListener(
      new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        if (isChecked) { 
         filter.setVisibility(View.VISIBLE); 
        } else { 
         filter.setVisibility(View.GONE);    
        } 
       } 
    }); 
+0

filter.setVisibility (View.VISIBLE); Son metin görünümünü referans gösterecektir. Bu yüzden sadece son metin görüntülemeyi gizleyecektir. – Killer

+0

Tam olarak değil :) Uygulamanın başka bir bölümünde bunu kullanıyorum ve iyi çalışıyor - her bir TextView gizleniyor :) – Bartos

cevap

2

Not.

textLine.setOnCheckedChangeListener() for döngüsünün dışına taşıyın; ve onCheckedChanged'un içinde - linearLayout tüm çocuklara geçiş yapın ve her çocuğun görünürlüğünü ayarlayın. durumda

textLine.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        for (View v : linearLayout.getChildren()) { 
         if (v instanceof TextView) { 
          if (isChecked) { 
           v.setVisibility(View.VISIBLE); 
          } else { 
           v.setVisibility(View.GONE);     
          } 
         } 
        } 
+0

Teşekkürler ama bu çözüm de ToggleButtons'u gizleyecektir (onlar da bu düzen içinde de) ve bunu yapmak istemiyorum :) – Bartos

+0

sonra ek bir ekleyiniz 'if (v instanceof TextView)' ... –

+0

Teşekkürler kardeşim, ihtiyacım buydu;) – Bartos

0

ben RecyclerView içine textView daha iyi bir fikir olacaktır koyarak düşünüyorum, dinamik textView görüntülemek istiyor. RecyclerView, Adapter ürününe sahiptir ve bu, veri ile çalınmasını ve textViews kullanımını kolaylaştırır. Bir deneyin recyclerView verin. RecycerView Yapmaya çalıştığınız şey birkaç saat içinde öğrenilebilir ve gökyüzü, recyclerView ile yapabileceğiniz şeylerin sınırıdır :)

1

Oluşturduğunuzda TextViews listesini tutabilirsiniz. Ardından, click dinleyicisini for-döngüsünün dışında, Dmitri'nin dediği gibi ayarlayın. Bu, TextViews listesi boyunca yinelenecek ve görünürlüğü GONE olarak ayarlayacaktır.

private void setup() { 
    List<View> textViews = new ArrayList<>(); 
    for (FilterItem filterItem : filterData.getFilterItemList()) { 
     View view = createTextViewFor(filterItem); 
     linearLayout.addView(filter); 

     textViews.add(view); 
    } 

    updateVisibility(textViews, View.GONE); 

    textLine.setOnCheckedChangeListener(
      new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int visibility = isChecked ? View.VISIBLE : View.GONE; 
        updateVisibility(textViews, visibility); 
       } 
      } 
    ); 
} 

private View createTextViewFor(FilterItem filterItem) { 
    TextView view = new TextView(MainPanelActivity.this); 
    view.setText(filterItem.getFilterItemName()); 
    view.setTextColor(R.color.black); 
    view.addFilter(filterItem); 
    return view; 
} 

private void updateVisibility(List<View> views, int visibility) { 
    for (View view : views) { 
     view.setVisibility(visibility); 
    } 
} 
İlgili konular