ferrari_nato
ferrari_nato

Reputation: 15

Update RecyclerView failed even after updating model success

My application failed to update view after inserting items. I am currently using MVP for building my application. I followed this guide. The author didn't give any further explanations about insert or remove item from list.

I've updated my RecyclerView to latest version (recyclerview-v7:28.0.0). I already checked my layout and also scrolling down. In my latest effort, I know that the list is successfully added, but my getItemCount is not updated yet. I insert inside model and after that notify adapter in Activity (notifyItemInserted). I've tried using notifyDataSetChanged but nothing works.

public class MainActivity extends AppCompatActivity implements MVPInterface.viewActivity{

  private RecyclerView.Adapter adapter;

  @Override
  protected void onCreate(Bundle savedInstanceState){
      recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
      recyclerView.setHasFixedSize(true);
      adapter = new WordAdapter(this);
      recyclerView.setAdapter(adapter);
      layoutManager = new LinearLayoutManager(this);
      recyclerView.setLayoutManager(layoutManager);

      mPresenter = new ActivityPresenter(this);
        addButton = (FloatingActionButton) findViewById(R.id.fab);
        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPresenter.onAddList();
            }
        });
      
  }

  @Override
  public void AddSuccess(int size){
       Log.d("HELLO","createthis "+size);
       recyclerView.getAdapter().notifyItemInserted(size);
       recyclerView.smoothScrollToPosition(size);
       recyclerView.getAdapter().notifyDataSetChanged();
  }

}
class WordAdapter extends RecyclerView.Adapter<WordAdapter.WordViewHolder>{
   
    @NonNull
    @Override
    public WordViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        Log.d("CREATE","create");
        android.view.View mItemView = mInflater.inflate(R.layout.content_main, viewGroup, false);
        return new WordViewHolder(mItemView, this);
    }

     @Override
    public void onBindViewHolder(@NonNull WordViewHolder viewHolder, int position) {
        Log.d("CREATE1","bind");
        mPresenter.onSetView(viewHolder, position);
    }
   
    @Override
    public int getItemCount() {
        int size = mPresenter.getListSize();
        Log.d("item", ""+size);
        return mPresenter.getListSize();
    }
    
    public class WordViewHolder extends RecyclerView.ViewHolder implements MVPInterface.WordHolder, android.view.View.OnClickListener {
        public TextView wordItemView;
        final WordAdapter mAdapter;

        public WordViewHolder(android.view.View mItemView, WordAdapter wordAdapter) {
            super(mItemView);
            wordItemView = (TextView) mItemView.findViewById(R.id.word);
            this.mAdapter = wordAdapter;
            mItemView.setOnClickListener(this);
        }

        @Override
        public void setText(String string) {
            wordItemView.setText(string);
        }

        @Override
        public void onClick(android.view.View v) {
            wordItemView.setText ("Clicked! "+ wordItemView.getText());
        }
    }
 
} 
    
public class AdapterPresenter {

    private LinkedList<String> wordList;
    private WordModel model;

    public AdapterPresenter(){
        this.model = new WordModel();
        this.wordList = model.initList();
    }
    public void onSetView(MVPInterface.WordHolder holder, int position) {
        holder.setText(wordList.get(position));
    }

    public int getListSize(){
        return model.getSize();
    }
}   
public class WordModel {
    private LinkedList<String> wordList = new LinkedList<>();
    private MVPInterface.viewActivity activity;
    private boolean isFirst = true;
    //private Listener listener;

    public WordModel(){
        this.wordList = initList();
    }

    public LinkedList<String> initList(){
        if(isFirst){
            for(int i = 0; i<20; i++){
                wordList.addLast("Word "+i);
            }
            isFirst = false;
        }
        return wordList;
    }


    public LinkedList<String> getWordList(){
        return wordList;
    }

    public int getSize(){
        return wordList.size();
    }

    public void addList(Listener listener){
        wordList.add("+ Word "+ getSize());
        listener.onAddSuccess();
    }
}
public class ActivityPresenter implements Listener {

    private WordModel wordModel;
    private MVPInterface.viewActivity activity;

    public ActivityPresenter(MVPInterface.viewActivity activity){
        this.activity = activity;
        this.wordModel = new WordModel();
    }

    public void onAddList() {
        wordModel.addList(this);
    }


    @Override
    public void onAddSuccess() {
        int size = wordModel.getSize();
        activity.AddSuccess(size);
    }
}

The list is successfully inserted (create this logcat message) but getItemCount remains same (CREATEItem).

Android Logcat: d

EDIT

I suspect that there's might be problem inside AdapterPresenter. I initialized wordModel inside presenter and thus making my list not dynamically changed (as in logcat, getItemCount won't update to lastest size). But i still don't know what is the exactly problem.

Upvotes: 1

Views: 79

Answers (1)

Misagh
Misagh

Reputation: 3613

I think you should remove setHasFixedSize(true) or replace it with setHasFixedSize(false)

Upvotes: 1

Related Questions