有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

构造函数中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>这是成功的,如图所示:

enter image description here

但是,当涉及到更改这些单词的颜色时,在onBindViewHolder中执行此操作,此列表现在为空:

enter image description here

尽管没有在其他地方修改此列表

下面是该列表的所有用法。第102-103行是上图中的行&;第43行在构造函数代码的上面

enter image description here

奇怪的是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) 个答案

  1. # 1 楼答案

    您的构造函数不复制数据,它只保留传入的完全相同的ArrayList。因此,如果稍后修改对象外部可用的ArrayList,这些更改也将反映在对象的ArrayList中,因为它们是同一个对象

    我建议创建一个新的ArrayList,然后使用Collections.addAll