Android 动态添加和隐藏文本视图
我有一个“for each”循环,它为列表中的每个对象创建textView,并将它们添加到线性布局中。它工作得很好。然后,当用户单击切换按钮时,我想隐藏所有的文本视图,但这里我遇到了问题-只有列表中的最后一个文本视图被隐藏,其余的仍然可见。我尝试用许多解决方案(例如getChild())来解决这个问题,但都没有效果Android 动态添加和隐藏文本视图,android,textview,Android,Textview,我有一个“for each”循环,它为列表中的每个对象创建textView,并将它们添加到线性布局中。它工作得很好。然后,当用户单击切换按钮时,我想隐藏所有的文本视图,但这里我遇到了问题-只有列表中的最后一个文本视图被隐藏,其余的仍然可见。我尝试用许多解决方案(例如getChild())来解决这个问题,但都没有效果 final List<FilterItem> filterItemList = filterData.getFilterItemList(); for (FilterIt
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);
}
}
});
最终列表filterItemList=filterData.getFilterItemList();
用于(FilterItem FilterItem:filterItemList){
最终文本视图过滤器=新文本视图(MainPanelActivity.this);
filter.setText(filterItem.getFilterItemName());
filter.setTextColor(R.color.black);
linearLayout.addView(过滤器);
filter.setVisibility(View.GONE);
textLine.setOnCheckedChangeListener(
新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
filter.setVisibility(View.VISIBLE);
}否则{
filter.setVisibility(View.GONE);
}
}
});
请注意,您正在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);
}
}
}
请注意,您正在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);
}
}
}
如果你想动态显示
textView
,我想把textView
放在RecyclerView
里面会更好。RecyclerView
有自己的Adapter
,这将使数据和textView
更容易播放。试试RecycerView
e> 因为你想做的事情可以在几个小时内学会,天空是你能用recyclerView
做的极限:)如果你想动态显示textView
,我想把textView
放在recyclerView
里面会是个更好的主意。recyclerView
有自己的适配器
这将使数据和文本视图的使用变得更加容易。请尝试一下RecycerView
。RecycerView
因为您要做的事情可以在几个小时内学会,sky是您可以使用recyclerView
:)进行操作的限制。您可以在创建文本视图时保留一个列表。然后设置如Dmitri所说,在for循环外单击listener,它将遍历TextView列表并将可见性设置为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);
}
}
private void setup(){
列表文本视图=新建ArrayList();
对于(FilterItem FilterItem:filterData.getFilterItemList()){
视图=createTextViewFor(filterItem);
linearLayout.addView(过滤器);
textViews.add(视图);
}
可更新性(TextView、View.GONE);
textLine.setOnCheckedChangeListener(
新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
int visibility=isChecked?View.VISIBLE:View.GONE;
可更新性(文本视图、可见性);
}
}
);
}
私有视图createTextViewFor(FilterItem FilterItem){
TextView视图=新的TextView(MainPanelActivity.this);
view.setText(filterItem.getFilterItemName());
view.setTextColor(R.color.black);
view.addFilter(filterItem);
返回视图;
}
私有void可更新性(列表视图、int可见性){
用于(视图:视图){
视图。设置可见性(可见性);
}
}
您可以在创建文本视图时保留它们的列表。然后按照Dmitri所说,在for循环外设置click listener,这将遍历文本视图列表,并将可见性设置为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);
}
}
private void setup(){
列表文本视图=新建ArrayList();
对于(FilterItem FilterItem:filterData.getFilterItemList()){
视图=createTextViewFor(filterItem);
linearLayout.addView(过滤器);
textViews.add(视图);
}
可更新性(TextView、View.GONE);
textLine.setOnCheckedChangeListener(
新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
int visibility=isChecked?View.VISIBLE:View.GONE;
可更新性(文本视图、可见性);
}
}
);
}
私有视图createTextViewFor(FilterItem FilterItem){
TextView视图=新的TextView(MainPanelActivity.this);
view.setText(filterItem.getFilterItemName());
view.setTextColor(R.color.black);
view.addFilter(filterItem);
返回视图;
}
私有void可更新性(列表视图、int可见性){
用于(视图:视图){
视图。设置可见性(可见性);
}
}
filter.setVisibility(View.VISIBLE);将为您提供上一个文本视图的引用。这就是它仅隐藏上一个文本视图的原因不完全是:)我在应用程序的另一部分中这样使用它,并且工作正常-隐藏每个文本视图:)filter.setV