1

Im new in realm db. I completed add and get data in realm db. But, I couldn't sort(ascending and descending).Im my code it display items in listview. Listview contains 5 list and each list contains 4 field(name, age, skill and date). if I sort(ascending) name, need to ascending in 5 list.My code is not work I post my code here,

 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();
}

Adapter class:

  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;
}

}

Ana
  • 174
  • 1
  • 2
  • 10

2 Answers2

1

Your code does't change db. You just get sorted items but don't use them.

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

To see your data sorted you should use RealmResults in your adapter. With this approach your list always will sorted, even after adding new items. But note: your adapter should extends RealmRecyclerViewAdapter.

You should run this code before creating adapter and use result inside adapter:

RealmResults<Employee> result = realm.where(Employee.class)
        .sort("name", Sort.ASCENDING).findAll();

Also you can try manually update data of your adapter.

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();
 }

You need to create updateData method yourself:

public void updateData(RealmResults<Employee> result) {
    employeeDetaillists = new ArrayList<Employee>(result);
}
Andrew Churilo
  • 2,229
  • 1
  • 17
  • 26
  • Im showing added items in listview. when I click buttton(button name is ascending) , listview display ascending and descending order(if click descending order button). – Ana Apr 12 '19 at 10:38
  • @Ana I've updated my answer to show another approach. – Andrew Churilo Apr 12 '19 at 10:42
  • Thanks. but employeedetailadapter.updateData(result); ... In this "updateData" is not set with adapter. – Ana Apr 12 '19 at 10:59
  • @Ana Yes, you should create this method. – Andrew Churilo Apr 12 '19 at 11:07
  • I create "updatedata" method in adapter. Inside this method, what i need write? can u please help me? public void updateData(RealmResults result) { } – Ana Apr 12 '19 at 11:25
  • @Ana To answer exactly I need to see code of your adapter. – Andrew Churilo Apr 12 '19 at 11:27
  • I upload my adapter class . Can you please check and update me? – Ana Apr 12 '19 at 11:39
  • Thanks. But this code doesn't work. it show empty listview – Ana Apr 12 '19 at 12:54
  • @Ana Are you see empty list after button click or all time? – Andrew Churilo Apr 12 '19 at 12:59
  • After button click list display empty. Now i find where the problem occur. private void Ascending_order() { RealmResults result = realm.where(Employee.class).findAll(); result = result.sort("name", Sort.ASCENDING); // i get result size is 0 here // employeedetailadapter.updateData(result); employeedetailadapter.notifyDataSetChanged(); } – Ana Apr 12 '19 at 13:03
  • @Any Do you have any idea why `result` is empty? – Andrew Churilo Apr 12 '19 at 13:10
  • No. Can You tell me the solution. This is my POJO CLASS . public class Employee extends RealmObject { PrimaryKey private int id; Required public String name,age,skill; – Ana Apr 12 '19 at 13:13
  • @Ana You need to do some experiments and look how app reacts to changes. For a start try remove `.sort("name", Sort.ASCENDING)`. `result` should not be empty, you should figure out where is bug. – Andrew Churilo Apr 12 '19 at 13:17
-1

First of all, while getting data from Realm you don't need to write it in Transaction. Write Transaction is required only when you are adding data in realm or updating any realm object.

And about your problem, To get sorted data from realm, You can do it like this

RealmResults<Employee> result = realm.where(Employee.class).sort("name", Sort.ASCENDING).findAll();

Now the data you got is sorted, If you still see wrong order in your ListView then there could be some issue in your Adapter. If you share your adapter code, then I can help further :)

Updated:

Adapter Class

  public class EmployeeDetailAdapter extends BaseAdapter {

    private RealmResults<Employee> employeeDetaillists;
    private Context c;
    private LayoutInflater inflater;
    private OnItemClick mCallback;
    private SimpleDateFormat df = new SimpleDateFormat("dd/mm/yyyy");



    public EmployeeDetailAdapter(Context c,RealmResults<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;
    }
}

In your Activity please change following function

 private void Ascending_order() {
      result = realm.where(Employee.class)
           .sort("name", Sort.ASCENDING).findAll();
     employeedetailadapter.notifyDataSetChanged();
  }

"result" list should be declared on class level and should be passed to Adapter's constructor as well.

Like

    class Activity {
      RealmResults<Employee> result;
      EmployeeDetailAdapter employeedetailadapter;

      //// Other Code

        public onCreate(Bundle b) {
         result = realm.where(Employee.class).findAll();
               employeedetailadapter = new EmployeeDetailAdapter(this, result, listener);

          // Other code
         }
   }
Asad Ali Choudhry
  • 4,985
  • 4
  • 31
  • 36