ListView 单元格中的重复数组元素发出 Parse Server
Posted
技术标签:
【中文标题】ListView 单元格中的重复数组元素发出 Parse Server【英文标题】:Repeating array elements in ListView cells issue Parse Server 【发布时间】:2018-12-15 01:47:48 【问题描述】:我有这段代码可以根据每个帖子从 Parse 服务器数据库中获取主题标签数组:
// Tags
List<String> tagsArray = new ArrayList<>();
if (pObj.getList(Configurations.POSTS_TAGS) != null)
tagsArray = pObj.getList(Configurations.POSTS_TAGS);
Log.i(Configurations.TAG, "TAGS: " + tagsArray);
for (int i=0; i<tagsArray.size(); i++)
LinearLayout tagsLayout = finalCell.findViewById(R.id.cpTagsLayout);
tagsLayout.setOrientation(LinearLayout.HORIZONTAL);
// Create Buttons
final Button tButt = new Button(ctx);
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 44, getResources().getDisplayMetrics());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, height);
lp.setMargins(3, 0, 3, 0);
tButt.setLayoutParams(lp);
tButt.setText(tagsArray.get(i));
tButt.setTypeface(Configurations.osItalic); tButt.setTextColor(Color.parseColor("#777777")); tButt.setBackgroundColor(Color.parseColor("#00000000"));
tButt.setTextSize(10);
tButt.setAllCaps(false);
tButt.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
String tag = tButt.getText().toString();
Log.i(Configurations.TAG, "SELECTED TAG: " + tag);
);
// Add button to the layout
tagsLayout.addView(tButt);
// ./For loop
// ./ If
应用程序在向下滚动 ListView 时正确获取标签数组,我通过检查 Logcat 知道:
I/log-: TAGS: [#quoteoftheday, #fun, #life]
I/log-: TAGS: [#breakfastinlove, #lifestyle, #pikkypic]
I/log-: TAGS: [#bigapple, #lifestyle]
无论如何,从第 3 个单元格开始,即使我再次向上滚动 ListView,我也会在每个单元格的 Scrollview 中获得额外的按钮,它们是之前数组的总和,例如,第 3 个单元格显示连续按以下按钮:#quoteoftheday #fun #life #breakfastinlove、#lifestyle、#pikkypic、#bigapple、#lifestyle
虽然它应该只显示:#bigapple #lifestyle
无论我在哪里滚动 ListView,Logcat 都会一直显示正确的标签数组,因此这意味着每个 tagsArray
都已从服务器正确获取。
如何解决这个奇怪的问题? 谢谢!
【问题讨论】:
你是否关闭了 for before tagsLayout.addView(tButt); ? no @JoaquinAlvarez,For 循环右括号在 tagsLayout.addView() 之后,您可以在代码中看到。 【参考方案1】:在添加新的 TagsRow 之前,您需要为您的 tagsLayout 调用 removeAllViews。 检查以下更正的代码:
List<String> tagsArray = new ArrayList<>();
if (pObj.getList(Configurations.POSTS_TAGS) != null)
tagsArray = pObj.getList(Configurations.POSTS_TAGS);
Log.i(Configurations.TAG, "TAGS: " + tagsArray);
LinearLayout tagsLayout = finalCell.findViewById(R.id.cpTagsLayout);
tagsLayout.setOrientation(LinearLayout.HORIZONTAL);
tagsLayout.removeAllViews();
for (int i=0; i<tagsArray.size(); i++)
// Create Buttons
final Button tButt = new Button(ctx);
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 44, getResources().getDisplayMetrics());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, height);
lp.setMargins(3, 0, 3, 0);
tButt.setLayoutParams(lp);
tButt.setText(tagsArray.get(i));
tButt.setTypeface(Configurations.osItalic); tButt.setTextColor(Color.parseColor("#777777")); tButt.setBackgroundColor(Color.parseColor("#00000000"));
tButt.setTextSize(10);
tButt.setAllCaps(false);
tButt.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
String tag = tButt.getText().toString();
Log.i(Configurations.TAG, "SELECTED TAG: " + tag);
);
// Add button to the layout
tagsLayout.addView(tButt);
// ./For loop
// ./ If
【讨论】:
你是对的,虽然我不得不稍微编辑你的代码,但你必须初始化 LinearLayout tagsLayout = finalCell.findViewById(R.id.cpTagsLayout);在 FOR 循环之前 ;) 非常感谢您的帮助! 最欢迎 :)以上是关于ListView 单元格中的重复数组元素发出 Parse Server的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift:在自定义 UITableView 单元格中更新二维数组时获取重复值