构造函数中java ArrayList分配的数据正在丢失其数据,尽管未在任何位置清除
我有一个奇怪的问题。我有一个RecyclerAdapter
,它有两个构造函数。我使用相同的适配器填充两个RecyclerViews
,我希望它们看起来相同,但它们略有不同&;它们分为两部分。因此,两个构造器:
public FinderRecycleAdapter(Context context, ArrayList<String> data) {
this.mInflater = LayoutInflater.from(context);
this.mData = data;
this.mContext = context;
groupsHidden = new ArrayList<>();
}
public FinderRecycleAdapter(Context context, ArrayList<String> data, ArrayList<String> userEnteredWords) {
this.mInflater = LayoutInflater.from(context);
this.mData = data;
this.mContext = context;
this.userEnteredWords = userEnteredWords;
groupsHidden = new ArrayList<>();
}
第二个是我遇到问题的地方。一切都显示&;跑。RecyclerView
将显示单词列表。用户将已经输入了这些单词中的一部分-我所要做的就是更改用户输入的列表中单词的颜色(这不是问题)。这些单词被传递并分配给一个ArrayList<string>
这是成功的,如图所示:
但是,当涉及到更改这些单词的颜色时,在onBindViewHolder
中执行此操作,此列表现在为空:
尽管没有在其他地方修改此列表
下面是该列表的所有用法。第102-103行是上图中的行&;第43行在构造函数代码的上面
奇怪的是this.mData
(也是一个ArrayList<string>
)在任何地方都被使用this.userEnteredWords
,但是this.mData
保留了它的值
这是整个onBindViewHolder
代码,但我认为您需要在onBindViewHolder
中看到的大部分内容都在第二个图像中
// binds the data to the TextView in each row
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String word = mData.get(position);
holder.wordRow.setText(word);
if (holder.wordRow.getText().toString().matches((".*\\d.*"))) {
int checkHeaderNum = Integer.parseInt(holder.wordRow.getText().toString().replaceAll("\\D+", ""));
holder.wordRow.setBackgroundColor(this.mContext.getResources().getColor(R.color.colorPrimary));
holder.wordRow.setTextColor(this.mContext.getResources().getColor(R.color.white));
holder.wordRow.setTextSize(25);
holder.wordRow.setBackground(ContextCompat.getDrawable(mContext, R.drawable.textview_rounded));
if (this.groupsHidden.contains(checkHeaderNum)) {
holder.wordRow.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_maximize_white_24dp, 0, R.drawable.ic_maximize_white_24dp, 0); //Inserts the maximizes symbol to the end of TextRow
} else {
holder.wordRow.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_minimize_white_24dp, 0, R.drawable.ic_minimize_white_24dp, 0); //Inserts the minimised symbol to the end of TextRow
}
holder.wordRow.setPadding(20, 0, 20, 0);
} else {
//Resets anything previously made as any attributes previously made will still hold unless reset here
holder.wordRow.setBackgroundColor(this.mContext.getResources().getColor(R.color.white));
holder.wordRow.setTextColor(this.mContext.getResources().getColor(R.color.browser_actions_text_color));
holder.wordRow.setBackgroundResource(0);
holder.wordRow.setTextSize(22);
holder.wordRow.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0);
holder.wordRow.setPadding(20, 0, 20, 0);
//Highlighting the letters the user has given if a condition was set - only for home fragment
if (isCondition()) {
int startingIndex = word.indexOf(getUsersLetterEntry());
int endingIndex = getUsersLetterEntry().length() + startingIndex;
final SpannableStringBuilder str = new SpannableStringBuilder(word);
str.setSpan(
new ForegroundColorSpan(ContextCompat.getColor(mContext, R.color.blue)), //Making selection colored
startingIndex,
endingIndex,
SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE
);
str.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //Making selection bold
holder.wordRow.setText(str);
}
//Setting the user entered words for the letter game to blue. This is only populated if has been called from the LettersGame fragment
if (this.userEnteredWords != null && this.userEnteredWords.size() > 0) {
if (this.userEnteredWords.contains(holder.wordRow.getText().toString())) {
holder.wordRow.setTextColor(this.mContext.getResources().getColor(R.color.blue));
holder.wordRow.setTypeface(Typeface.DEFAULT_BOLD);
}
}
}
我是不是遗漏了一些显而易见的东西?我以前没见过这个
# 1 楼答案
您的构造函数不复制数据,它只保留传入的完全相同的ArrayList。因此,如果稍后修改对象外部可用的ArrayList,这些更改也将反映在对象的ArrayList中,因为它们是同一个对象
我建议创建一个新的
ArrayList
,然后使用Collections.addAll