android - 排序在我的应用程序的领域数据库中不起作用
问题描述
我是领域数据库的新手。我在领域数据库中完成了添加和获取数据。但是,我无法排序(升序和降序)。我的代码在列表视图中显示项目。Listview 包含 5 个列表,每个列表包含 4 个字段(姓名、年龄、技能和日期)。如果我对(升序)名称进行排序,需要在 5 个列表中升序。我的代码不起作用我在这里发布我的代码,
private void Ascending_order() {
realm.beginTransaction();
RealmResults<Employee> result = realm.where(Employee.class)
.sort("name", Sort.ASCENDING).findAll();
realm.copyFromRealm(result);
realm.commitTransaction();
employeedetailadapter.notifyDataSetChanged();
}
适配器类:
public class EmployeeDetailAdapter extends BaseAdapter {
private ArrayList<Employee>employeeDetaillists = new ArrayList<>();
private Context c;
private LayoutInflater inflater;
private OnItemClick mCallback;
private SimpleDateFormat df = new SimpleDateFormat("dd/mm/yyyy");
public EmployeeDetailAdapter(Context c,ArrayList<Employee> employeeDetaillists, OnItemClick listener) {
this.employeeDetaillists = employeeDetaillists;
this.c= c;
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.mCallback = listener;
}
@Override
public int getCount() {
return employeeDetaillists.size();
}
@Override
public Object getItem(int position) {
return employeeDetaillists.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
Holder holder;
if (v==null){
v= (View) inflater.inflate(R.layout.list_single_item,null);
holder = new Holder();
holder.tvPersonName = (TextView) v.findViewById(R.id.tvPersonName);
holder.tvPersonAge = (TextView) v.findViewById(R.id.tvPersonAge);
holder.tvPersonSkill = (TextView) v.findViewById(R.id.tvPersonSkill);
holder.ivEditPesonDetail=(ImageView)v.findViewById(R.id.ivEditPesonDetail);
holder.tvPersondate=(TextView)v.findViewById(R.id.tvPersondate);
holder.ivDeletePerson=(ImageView)v.findViewById(R.id.ivDeletePerson);
v.setTag(holder);
}else{
holder = (Holder) v.getTag();
}
holder.tvPersonName.setText(employeeDetaillists.get(position).getName());
holder.tvPersonAge.setText(employeeDetaillists.get(position).getAge());
holder.tvPersonSkill.setText(employeeDetaillists.get(position).getSkill());
String strDate = df.format(employeeDetaillists.get(position).getSdate());
holder.tvPersondate.setText(strDate);
holder.ivDeletePerson.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Delete(employeeDetaillists.get(position).getName(),position);
}
});
return v;
}
private void Delete(String name, int position) {
mCallback.onClickdelete(name, position);
}
public void updateData(RealmResults<Employee> result) {
}
class Holder {
TextView tvPersonName, tvPersonAge, tvPersonSkill,tvPersondate;
ImageView ivDeletePerson, ivEditPesonDetail;
}
}
解决方案
您的代码不会更改 db. 你只是得到排序的项目,但不使用它们。
realm.copyFromRealm(result); // this line does nothing
realm.commitTransaction(); // this one too, because you change nothing
employeedetailadapter.notifyDataSetChanged(); // you data is the same, so this line also useless here
要查看已排序的数据,您应该RealmResults
在适配器中使用。使用这种方法,您的列表始终会排序,即使在添加新项目之后也是如此。但请注意:您的适配器应该扩展RealmRecyclerViewAdapter
.
您应该在创建适配器之前运行此代码并result
在适配器内部使用:
RealmResults<Employee> result = realm.where(Employee.class)
.sort("name", Sort.ASCENDING).findAll();
您也可以尝试手动更新适配器的数据。
private void Ascending_order() {
RealmResults<Employee> result = realm.where(Employee.class)
.sort("name", Sort.ASCENDING).findAll();
employeedetailadapter.updateData(result); // update data inside adapter before calling `notifyDataSetChanged`
employeedetailadapter.notifyDataSetChanged();
}
您需要updateData
自己创建方法:
public void updateData(RealmResults<Employee> result) {
employeeDetaillists = new ArrayList<Employee>(result);
}
推荐阅读
- c# - DataGridView 生成 IndexOutOfRangeException
- jquery - 通过ajax提交多个表单
- opengl-es - 为什么在使用 gl.polygonOffset 时需要因子?
- python - 关于python数据库编程的查询
- angular - 如何从子组件中过滤父组件中的可观察对象?
- java - 错误:在类 testPackage.Method1 中找不到主要方法
- javascript - 获取 JS 中的所有 .m4a 文件
- python - 使用非 JSON 格式的表单数据抓取 ajax 调用
- javascript - Sticky Bootstrap 列应以父/内容结尾
- android - Android Studio 使用 Dagger 2 将依赖项注入到动态创建的片段中