动态添加和隐藏textView

时间:2016-04-02 13:03:52

标签: android textview

我有“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);             
                    }
                }
    });

3 个答案:

答案 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。试试recyclerViewRecycerView您可以在几小时内学习recyclerView,天空是List<Integer> unsortedList = new ArrayList(); List<Integer> sortedList = new ArrayList(); 可以做的限制:)