2015-10-06 53 views
2

我無法弄清楚這是什麼問題。我試圖從類型Idea添加一個對象「想法」到列表ideaList。然後它拋出這個異常。有誰知道?UnsupportedOperationException當添加元素到列表(無Arrays.asList)

在smoca.ch.kreagen java.lang.UnsupportedOperationException 在java.util.AbstractList.add(AbstractList.java:404) 在java.util.AbstractList.add(AbstractList.java:425) (FragmentStateHandler.java:69) at smoca.ch.kreagen.Adapters.ArchiveAdapter $ 1.onClick(ArchiveAdapter.java:50).Fragments.VotingFragment。 ) 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)); 
    } 
} 

}

回答

3

不能修改你得到的名單早在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。

+0

好的,謝謝。我認爲這不是不變的。 我嘗試新的ArrayList並給出一些反饋。 –

+0

我仍然得到相同的錯誤。無法找到谷歌上的任何東西。 這是原因:ideaList.add(choosenIdea); 異常:java.lang.UnsupportedOperationException –

+0

@CodingJohn我更新了答案,錯過了您將列表重新分配給查詢結果。 –