使用对象本身的值对对象的列表视图进行排序 - 在DB中进行查询之后

时间:2015-10-07 15:05:00

标签: android sorting listview android-listview

我正在使用自定义适配器来填充ListView。 使用查询检索数据到远程数据库。

我在查询结果的自定义适配器中进行迭代,然后使用notifyDataSetChanged()

将每个对象发送到列表视图

对象包含值String TimeUpdated(DateTime类)。

我想根据TimeUpdated值对列表视图中的对象进行排序。

根据我的阅读,我必须在我的迭代中执行此操作,然后再调用'notifyDataSetChanged();'在我的适配器内。

但我不知道该怎么做。

如果我的理解是正确的,有人可以共享示例代码吗?

关心社区

更新时间:08/10/2015

我想我必须从查询结果的迭代中在我的适配器中创建一个arrayList。

所以我这样做了: 1.I迭代我的查询结果并将每个对象放在arrayList中。 所以我有一个包含对象的arraylist。 2.每个对象都有一个包含“纬度,经度”的字符串值。

我想从远离我的地方对它们进行排序。

距离的计算已经开始。

我现在想不出办法对列表进行排序?

private void sortMyList(List<Document> resultsArray) {
    Collections.sort(resultsArray, new Comparator<Document>() {
        @Override
        public int compare(Document doc1, Document doc2) {
            String DistanceDoc1 = Double.toString(calculateDistance(location.getLongitude(),location.getLatitude(), getDocLng(doc1), getDocLat(doc1)));
            String DistanceDoc2 = Double.toString(calculateDistance(location.getLongitude(),location.getLatitude(), getDocLng(doc2), getDocLat(doc2)));
            return DistanceDoc1.compareToIgnoreCase(DistanceDoc2);
        }
    });
    notifyDataSetChanged();
}

重要提示:

我使用两个适配器来构造包含查询结果的ListView。 父母名为LiveQueryAdapter,从BaseAdapter延伸。 片段中的一个称为DocumentAdapter ...,其范围从LiveQueryAdapter

延伸

LiveQueryAdapter类

public class LiveQueryAdapter extends BaseAdapter {

public String TAG = "LiveQueryAdapter";
private LiveQuery query;
private QueryEnumerator enumerator;
private Context context;

int i;

public LiveQueryAdapter(Context context, LiveQuery query) {
    this.context = context;
    this.query = query;

    query.addChangeListener(new LiveQuery.ChangeListener() {
        @Override
        public void changed(final LiveQuery.ChangeEvent event) {

            ((Activity) LiveQueryAdapter.this.context).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    enumerator = event.getRows();

                     ***I am thinking about iterate and sort  objects         here...***

                    notifyDataSetChanged();
                }
            });
        }
    });

    query.start();
}

@Override
public void notifyDataSetChanged() {
    //do your sorting here

    super.notifyDataSetChanged();
}

@Override
public int getCount() {
    return enumerator != null ? enumerator.getCount() : 0;
}

@Override
public Object getItem(int i) {
    return enumerator != null ? enumerator.getRow(i).getDocument() : null;
}

@Override
public long getItemId(int i) {
    return enumerator.getRow(i).getSequenceNumber();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    return null;
}

public void invalidate() {
    if (query != null)
        query.stop();
}

}

DocumentAdapter类(我的片段内部类)

    private class DocumentAdapter extends LiveQueryAdapter {

    public DocumentAdapter(Context context, LiveQuery matchQuery) {
        super(context, matchQuery);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) parent.getContext().
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.custom_item_matches_fragment, null);
        }

        final Document doc = (Document) getItem(position);

        Log.i(TAG, "doc is : " + doc.getProperty("userId"));

        if (doc == null || doc.getCurrentRevision() == null) {
            return convertView;
        }

     HERE I DO SET VIEWS IN MY LAYOUT (TEXT & PICTURES)

        return convertView;

    }
}

在我的片段中:

在我的Fragment的onCreateView()中调用此适配器,如下所示:

    mAdapter = new DocumentAdapter(getActivity(), matchQuery);

    // Set the adapter
    mListView = (ListView) view.findViewById(R.id.listview_matches);
    mListView.setAdapter(mAdapter);
    // Set OnItemClickListener so we can be notified on item clicks
    mListView.setOnItemClickListener(this);

1 个答案:

答案 0 :(得分:0)

也许这可以帮助

   class myAdapter extends BaseAdapter {

        private List<String> mList;

        public void setList(List<String> list){
            mList.clear();
            mList.addAll(list);
            sortMyList();
        }

        private void sortMyList() {
            //Do sorting of the list

            notifyDataSetChanged();
        }

        @Override
        public int getCount() {
            return 0;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return null;
        }
    }

然后你可以打电话

myAdapter.setList(list);

将设置列表并对其进行排序。

<强>分拣:

Collections.sort(empList, new Comparator<Employee>(){
  public int compare(Employee emp1, Employee emp2) {
    return emp1.getFirstName().compareToIgnoreCase(emp2.getFirstName());
  }
});

取自此处:Android-java- How to sort a list of objects by a certain value within the object