Android adicionar / substituir itens no RecyclerView

Eu sei que já existem muitos tópicos sobre esse tópico, mas nenhuma das soluções fornecidas funcionou para mim até agora. Estou tentando adicionar ou atualizar um item de umRecyclerView. Aqui está o meu código até agora:

Atividade principal

private MyListItemAdapter mAdapter;
private RecyclerView recyclerView;

// called on activity create
private void init() {
    // initialize activity, load items, etc ...
    mAdapter = new MyListItemAdapter(this, items);
    recyclerView.setAdapter(mAdapter);
}

// called when I want to replace an item
private void updateItem(final Item newItem, final int pos) {
    mAdapter.replaceItem(newItem, pos);
}

MyListItemAdapter

public class MyListItemAdapter extends RecyclerView.Adapter<MyListItemAdapter.MyListItemViewHolder> {

    private List<Item> mItems;

    public void replaceItem(final Item newItem, final int pos) {
        mItems.remove(position);
        mItems.add(position, newItem);

        notifyItemChanged(position);
        notifyDataSetChanged();
    }    
}

Eu tentei fazer essas alterações doMainActivity além disso, mas em todos os casos eu tentei minha lista não é atualizada. A única maneira que funcionou foi quando redefinii o adaptador para o recyclerView:

mAdapter.notifyDataSetChanged();
recyclerView.setAdapter(mAdapter);

o que obviamente é uma má ideia. (além dos efeitos colaterais ruins, nem funcionaria quando estou usando o carregamento lento nas minhas listas).

Então, minha pergunta é: como posso fazernotifyDataSetChanged() trabalhe corretamente?

editar

Encontrei uma solução para substituir itens. Depois demAdapter.replaceItem(newItem, pos); Eu tive que ligarrecyclerView.removeViewAt(position);

Isso funciona para substituir um item, mas não resolve o meu problema quando quero adicionar itens (por exemplo, carregamento lento) à minha lista

edit2

Encontrei uma solução funcional para adicionar itens

Adaptador:

public void addItem(final Item newItem) {
    mItems.add(newItem);
    notifyDataSetChanged();
}

Atividade:

private void addItem(final Item newItem) {
    mAdapter.addItem(newItem);
    recyclerView.removeViewAt(0); // without this line nothing happens
}

Por alguma razão, isso funciona (também: não remove a visualização na posição 0), mas tenho certeza de que não é a maneira correta de adicionar itens a um reciclador

questionAnswers(2)

yourAnswerToTheQuestion