我有“for each”循环,它为列表中的每个对象创建textView并将它们添加到线性布局中。它很棒。然后我想在用户点击切换按钮时隐藏所有textViews但这里我遇到了问题 - 只有列表中的最后一个textView被隐藏,其余部分仍然可见。我尝试用许多解决方案解决这个问题(例如使用getChild()),但没有任何效果。
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 :(得分:2)
请注意,您在for循环中设置了textLine
的侦听器 - 因此,对于每次迭代,您都会设置一个新的侦听器,以更改当前迭代器中创建的TextView
的可见性。
将textLine.setOnCheckedChangeListener()
移到for循环之外;在onCheckedChanged
内 - 循环遍历linearLayout
的所有子项,并为每个孩子设置可见性。
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);
}
}
}
答案 1 :(得分:1)
创建TextView时,可以保留TextView列表。然后像Dmitri所说的那样在for循环外部设置click侦听器,它将迭代TextViews列表并将可见性设置为GONE。
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);
}
}
答案 2 :(得分:0)
如果您想动态显示textView
,我认为将textView
放在RecyclerView
内会更好。 RecyclerView
有自己的Adapter
,可以轻松播放数据和textViews
。试试recyclerView
。 RecycerView
您可以在几小时内学习recyclerView
,天空是List<Integer> unsortedList = new ArrayList();
List<Integer> sortedList = new ArrayList();
可以做的限制:)