3

我有一个ArrayAdapter<Summary>包含事件列表的自定义。中有重复的值List<Summary>,所以我试图将值放入,List<Summary>但这LinkedHashSet<Summary>会显示一个空白页。

如何将自定义转换ArrayListLinkedHashSet获取唯一数据?

主.java:

LinkedHashSet<Summary> listToSet = new LinkedHashSet<Summary>();
final List<Summary> summaries = new ArrayList<Summary>();

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v =  inflater.inflate(R.layout.events_summary, container, false);

    .......

    setListView(month, year, date_value);
    summaryAdapter = new SummaryAdapter(this.getActivity().getApplicationContext(), R.layout.listview_item_row, listToSet);

    calendarSummary = (ListView) v.findViewById(R.id.calendarSummary);
    calendarSummary.setAdapter(summaryAdapter);

    return v;
}

public void setListView(int month, int year, int dv) {

        events = new HolidayEvents();
        _calendar = Calendar.getInstance(Locale.getDefault());
        int totalDays = _calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

        for(int i = 1; i <= totalDays; i++){
            if(isHoliday(i, month, year, dv))
            {
                date = i + " " + getMonthForInt(month-1) + " " + year;

                for (Event event : events.eventDetails(this, month, i)) 
                {
                       summaries.add(new Summary(date, event.eventdetails));
                       listToSet.addAll(summaries);

                } 
            }
        }
}

ArrayAdapter.java:

public class SummaryAdapter extends ArrayAdapter<Summary>{

    Context context; 
    int layoutResourceId;
    LayoutInflater mInflater;
    LinkedHashSet<Summary> list = null;
    List<Summary> data = null;


    public SummaryAdapter(Context context, int layoutResourceId, LinkedHashSet<Summary> summaries) {
        super(context, layoutResourceId);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.list = summaries;
        data = new ArrayList<Summary>(list); //converting LinkedHashSet to List
        mInflater = LayoutInflater.from(context);
    }

 ....rest of the code retrieving data by using data.get(position) ...
4

1 回答 1

1

您需要确保放入 Set 的类正确覆盖 Equals 和 hashCode 函数。

让我们看看 hashCode 没有被覆盖的情况:

import java.util.*;

public class Example {

    public static class Abc {
        protected String s;
        public Abc(String s) {
            this.s = s;
        }

        @Override
        public boolean equals(Object other) {
            if (other instanceof Abc) {
                return ((Abc) other).s.equals(this.s);
            }
            return false;
        }

        @Override
        public int hashCode() {
            return (int) (Math.random() * Integer.MAX_VALUE);
        }

        public String toString() {
            return "Abc: " + this.s; 
        }
    }

    public static void main(String[] args) {

        ArrayList<Abc> ar = new ArrayList<>();

        ar.add(new Abc("a"));
        ar.add(new Abc("a"));
        ar.add(new Abc("a"));

        LinkedHashSet<Abc> lhs = new LinkedHashSet<>(ar);

        System.out.println("ar: " + ar);
        System.out.println("LinkedHashSet: " + lhs);

    }
}

这将产生:

ar:[Abc:a,Abc:a,Abc:a] LinkedHashSet:[Abc:a,Abc:a,Abc:a]

即使 equals 已正确实施。我相信您可能想要仔细检查 HashCodes 和 Equals 的正确实现。

于 2016-10-27T07:42:43.150 回答