RecyclerView not updating after calling changeCursor
Asked Answered
P

0

1

Background:

I have an orders table in my database whose data I show in RecyclerView. I do it by using a CursorAdapter in RecyclerView.Adapter. All of this is done in parent activity.

Besides this I have a child activity which is responsible for adding new orders to orders table and then coming back to parent activity to show all the orders in RecyclerView including the newly ones just created. New orders are added by starting a child activity in addOrder().

Problem:

When I come back from child activity to parent activity (after successful adding new orders to orders table) I try to refresh the RecyclerView with the help of changeCursor() but I don't see the RecyclerView getting updated with new data.

My Code:

Adapter:

public class OrderListAdapter extends RecyclerView.Adapter<OrderListAdapter.ViewHolder> {

    private CursorAdapter userList;
    private Context context;

    public OrderListAdapter(Context context, Cursor list){

        this.context = context;
        userList = new CursorAdapter(this.context, list, 0) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent) {
                // Code for inflater
            }

            @Override
            public void bindView(View view, Context context, Cursor cursor) {
                // Code for bindView
            }
        };
    }

    public CursorAdapter getCursorAdapter(){ return userList; }

    public double getTotalPrice(){
        Cursor records = userList.getCursor();
        double total = 0;
        while (records.moveToNext()) {
              double price = records.getDouble(4);
              int quantity = records.getInt(3);
              total += price * quantity;
        }
        return total;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = userList.newView(context, userList.getCursor(), parent);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        userList.getCursor().moveToPosition(position);
        userList.bindView(holder.itemView, context, userList.getCursor());
    }

    @Override
    public int getItemCount() { return userList.getCount(); }

    public class ViewHolder extends RecyclerView.ViewHolder {
        // declaring holder variables
        public ViewHolder(View itemView){
            super(itemView);
           // Initialising holder variables
        }
    }
}

ParentActivity:

public class ParentActivity extends AppCompatActivity {

     private TextView totalText;
     private OrderListAdapter orderAdapter;
     private RecyclerView orderView; 

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_parent);
         totalText = findViewById(R.id.orderTotal);
         showTable();
     }

     private void setAdapter(Cursor records){
         orderView = findViewById(R.id.tableContent); 
         orderView.setLayoutManager(new LinearLayoutManager(this));
         orderList = new ArrayList<>();
         orderAdapter = new OrderListAdapter(this, records);
         orderView.setAdapter(orderAdapter);
     }

     private void showTotalPrice(){
         double totalPrice = orderAdapter.getTotalPrice();
         totalText.setText(String.valueOf(totalPrice));
     }

     private void showTable(String item){
         totalText.setText("0.0");
         Cursor records = db.query("orders", null, null, null, null, null, null);
         setAdapter(records);
         showTotalPrice();        
     }

     private void updateTable(){
         Cursor records = db.query("orders", null, null, null, null, null, null);
         orderAdapter.getCursorAdapter().changeCursor(records);
     }
     // This is called on click of a button 
     public void addOrder(View view){
         startActivity(new Intent(getApplicationContext(), ChildActivity.class));
         updateTable(); // this doesn't update the RecyclerView
         showTotalPrice();
     }
}

If I comment out showTotalPrice() in addOrder() the RecyclerView seems to get updated with new orders. Why is that the case ? why is showTotalPrice() preventing the update ? I need showTotalPrice() in order to show the updated total price of the products in the table.

Polychaete answered 5/8, 2020 at 18:47 Comment(6)
add notifyDataSetChanged()Volsci
We don't need to call notifyDataSetChanged() its called by changeCursor() internally look at the comments of this post: #7027219:Polychaete
As I said in my post the RecyclerView gets updated only if I comment out showTotalPrice() so the problem is with showTotalPrice()Polychaete
@IntelliJAmiya Thanks :) please help I still can't find a solution :(Polychaete
Kindly create a demoVolsci
@IntelliJAmiya I found a better approach Thanks anyways :) gist.github.com/skyfishjy/443b7448f59be978bc59Polychaete

© 2022 - 2024 — McMap. All rights reserved.