BruceOverflow
BruceOverflow

Reputation: 576

notifyDatasetChanged in RecyclerView not working from Fragment

I'm calling notifyDataSetChanged method on my adapter after a db change, but this method not updating the view.

myclass fragment on tap on cardview open a external activity i use the interface for receive the event onActivityResult (this fire correctly)

public interface StartActivityForResultInterface {
    public void myStartActivityForResult(Intent intent, int requestCode);
}

myclass fragment

public class ContentFragment extends Fragment implements StartActivityForResultInterface {

    private PaffVocaliAdapter m_adapter;

    @Override
    public void myStartActivityForResult(Intent intent, int requestCode) {
        // do pre-processing here if you need to
        startActivityForResult(intent, requestCode);
    }

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


        dbmanPaffVocali loc_dbmanPafflocali = new dbmanPaffVocali((getActivity()));
        List<PaffVocali> items = loc_dbmanPafflocali.lista();

        if (items.size() == 0)
        {
            for (int i = 0; i < 10; i++) {
                PaffVocali p = new PaffVocali();
                p.setTitolo("Tab #" + " item #" + i);
                items.add(p);
            }
        }

        m_adapter = new PaffVocaliAdapter(items);
        m_adapter.setCallback(this);

        RecyclerView recyclerView = (RecyclerView)v.findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(m_adapter);

        return v;
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        m_adapter.notifyDataSetChanged();
    }

}

myadapter class

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

private List<PaffVocali> mItems;
private StartActivityForResultInterface myInterface;

PaffVocaliAdapter(List<PaffVocali> items) {
    mItems = items;
}

public void setCallback (StartActivityForResultInterface myInterface) {
    this.myInterface = myInterface;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_listapaff, viewGroup, false);

    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    final PaffVocali item = mItems.get(i);
    viewHolder.mTextViewTitolo.setText(item.getTitolo());

    viewHolder.mTextViewEdit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Context context = view.getContext();
            //context.startActivityForResult(new Intent(context, crud_activity_paff.class));
            Intent intent = new Intent(context, crud_activity_paff.class);
            intent.putExtra("id",item.getId());
            myInterface.myStartActivityForResult(intent, 1);
        }
    });
}



@Override
public int getItemCount() {
    return mItems.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    private final TextView mTextViewTitolo;
    private final TextView mTextViewEdit;

    ViewHolder(View v) {
        super(v);
        mTextViewTitolo = (TextView) v.findViewById(R.id.cardpaff_titolo);
        mTextViewEdit = (TextView) v.findViewById(R.id.cardpaff_edit);

    }
}
}

I'm sure that the db is changed, the new data is shown when I restart the app.

Upvotes: 3

Views: 5285

Answers (2)

user205569
user205569

Reputation: 46

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
   dbmanPaffVocali loc_dbmanPafflocali = new dbmanPaffVocali((getActivity()));
    List<PaffVocali> items = loc_dbmanPafflocali.lista();

    if (items.size() == 0)
    {
        for (int i = 0; i < 10; i++) {
            PaffVocali p = new PaffVocali();
            p.setTitolo("Tab #" + " item #" + i);
            items.add(p);
        }
    }
    m_adapter.setMItems(items);//add the method
    m_adapter.notifyDataSetChanged();
}

Try

Upvotes: 3

Midhun MP
Midhun MP

Reputation: 107121

You are calling the notifyDataSetChanged, but you didn't updated the data in the adapter class, that's the reason why you are not seeing any change in the RecyclerView. You need to update the data (pass new data to adapter) before calling notifyDataSetChanged.

Change your onActivityResult like:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    dbmanPaffVocali loc_dbmanPafflocali = new dbmanPaffVocali((getActivity()));
    List<PaffVocali> items              = loc_dbmanPafflocali.lista();

    if (items.size() == 0)
    {
        for (int i = 0; i < 10; i++)
        {
            PaffVocali p = new PaffVocali();
            p.setTitolo("Tab #" + " item #" + i);
            items.add(p);
        }
    }

    m_adapter.setData(items);
    m_adapter.notifyDataSetChanged();
}

And in your adapter class implement a public method for passing the new data:

public void setData(List<PaffVocali> items)
{
    mItems = items;
}

Upvotes: 2

Related Questions