android - 将元素添加到列表时出现 UnsupportedOperationException(无 Arrays.asList)

标签 android list exception addition unsupportedoperation

我不知道这里出了什么问题。我正在尝试将 Idea 类型中的对象“idea”添加到列表 ideaList 中。然后它抛出这个异常。有人知道吗?

java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:404) at java.util.AbstractList.add(AbstractList.java:425) at smoca.ch.kreagen.Fragments.VotingFragment.(VotingFragment.java:50) at smoca.ch.kreagen.FragmentStateHandler.chooseAndShowForVoting(FragmentStateHandler.java:69) at smoca.ch.kreagen.Adapters.ArchiveAdapter$1.onClick(ArchiveAdapter.java:50) at android.view.View.performClick(View.java:5155)

我想在列表创建并由领域数据填充后添加它。 就在第一个构造函数中,以 Idea 作为参数。

类代码:

public class VotingFragment extends Fragment implements  VotingAdapter.ClickListener{

private RecyclerView recyclerView;
private VotingAdapter votingAdapter;
private Realm realm;
private List<Idea> ideaList;
private List<Vote> voteList;
private List<Owner> ownerList;
private FragmentStateHandler fragmentStateHandler;
private TextView status;
private Button startVoting;
private Button stopVoting;

public VotingFragment(Idea idea) {
    getData();
    ideaList.add(idea);
    setStatus(true);
}

public VotingFragment() {
    getData();
    setStatus(false);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    super.onCreateView(inflater, container, savedInstanceState);
    View layout = inflater.inflate(R.layout.voting_fragment_layout, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.votingDrawerList);
    realm = Realm.getInstance(getActivity());
    fragmentStateHandler = FragmentStateHandler.getInstance();

    // get buttons and views
    status = (TextView) layout.findViewById(R.id.statusTextView);
    startVoting = (Button) layout.findViewById(R.id.startButton);
    stopVoting = (Button) layout.findViewById(R.id.stopButton);

    // clicklisteners for start/stop
    startVoting.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setStatus(true);
            // put ideas in List
            // put votes in List
            // put Owners in List
            // sort Voting
            // set timestamp (24h)

        }
    });

    stopVoting.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setStatus(false);
            // clear ideas from List
            // put voting in History


        }
    });

    votingAdapter = new VotingAdapter(getActivity(), ideaList, voteList, ownerList);    // params: context, idealist, votelist, ownerlist
    votingAdapter.setClickListener(this);   // set clicklistener on this
    recyclerView.setAdapter(votingAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));


    return layout;
}


public void getData() {
    ideaList = Collections.emptyList();
    voteList = Collections.emptyList();
    ownerList = Collections.emptyList();

    try {
        RealmQuery<Idea> ideaQuery = realm.where(Idea.class);
        RealmResults<Idea> ideaQueryResult = ideaQuery.findAll();

        RealmQuery<Vote> voteQuery = realm.where(Vote.class);
        RealmResults<Vote> voteQueryResult = voteQuery.findAll();

        RealmQuery<Owner> ownerQuery = realm.where(Owner.class);
        RealmResults<Owner> ownerQueryResult = ownerQuery.findAll();

        ideaList = ideaQueryResult;
        voteList = voteQueryResult;
        ownerList = ownerQueryResult;

    } catch (Exception e) { e.printStackTrace();}

    Log.d("joris", "" + ideaList);
    Log.d("joris", "" + voteList);
    Log.d("joris", "" + ownerList);

}

// items clicked in recyclerview
@Override
public void itemClicked(View view, int position) {
    Idea current = ideaList.get(position);
    fragmentStateHandler.showIdeaFrag(current);

}

public void setStatus(boolean val) {
    if(val) {
        status.setText("OPEN");
        status.setTextColor(getResources().getColor(R.color.Green));
    } else {
        status.setText("CLOSED");
        status.setTextColor(getResources().getColor(R.color.Red));
    }
}

}

最佳答案

您无法修改作为 RealmResult 返回的列表

相反,您可能希望复制查询结果以获取可变列表。

类似于

ideaList = new ArrayList<>();
voteList = Collections.emptyList();
ownerList = Collections.emptyList();

try {
    RealmQuery<Idea> ideaQuery = realm.where(Idea.class);
    RealmResults<Idea> ideaQueryResult = ideaQuery.findAll();

    RealmQuery<Vote> voteQuery = realm.where(Vote.class);
    RealmResults<Vote> voteQueryResult = voteQuery.findAll();

    RealmQuery<Owner> ownerQuery = realm.where(Owner.class);
    RealmResults<Owner> ownerQueryResult = ownerQuery.findAll();

    ideaList.addAll(ideaQueryResult);
    voteList = voteQueryResult;
    ownerList = ownerQueryResult;

} catch (Exception e) { e.printStackTrace();}

如您所见,您不能再使用 Collections.emptyList 作为默认值,因为它是不可变的,我们不是直接使用 ideaQueryResult,而是将列表中的所有元素复制到我们自己的可变 ArrayList 中。

关于android - 将元素添加到列表时出现 UnsupportedOperationException(无 Arrays.asList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32965592/

相关文章:

android - Jetpack 原型(prototype)数据存储 - 使用 Kotlin dsl 进行 gradle 配置

java - RxAndroid : UI changes on Schedulers. io() 线程

python - 如何将字典列表合并到字典键:list pairing?

list - 将列表附加到 Haskell 中的列表列表中?

Python - 文件中的元组列表

android - MapActivity 中的 ClassNotFoundException?

python - merry 处理 python 中的异常吗?

android - Paypal 集成安卓

c# - 适用于 Android 的 Mono 的 Facebook SDK

mongodb - 如何找到导致 bson.errors.InvalidStringData 的值