Не удалось обновить RecyclerView даже после успешного обновления модели - PullRequest
1 голос
/ 19 июня 2019

Моему приложению не удалось обновить вид после вставки элементов.В настоящее время я использую MVP для создания моего приложения.Я следовал этому руководству.Автор не дал никаких дальнейших объяснений по поводу вставки или удаления элемента из списка.

Я обновил свой RecyclerView до последней версии (recyclerview-v7: 28.0.0).Я уже проверил свой макет, а также прокрутить вниз.В своих последних усилиях я знаю, что список успешно добавлен, но мой getItemCount еще не обновлен.Я вставляю внутрь модели и после этого уведомляю адаптер в Activity (notifyItemInserted).Я пытался использовать notifyDataSetChanged, но ничего не работает.

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

Список успешно вставлен (создайте это сообщение logcat), но getItemCount остается тем же (CREATEItem).

Android Logcat: d

РЕДАКТИРОВАТЬ

Я подозреваю, что внутри AdapterPresenter может быть проблема.Я инициализировал wordModel внутри Presenter и, таким образом, мой список не изменялся динамически (как в logcat, getItemCount не будет обновляться до последнего размера).Но я до сих пор не знаю, в чем именно проблема.

1 Ответ

1 голос
/ 19 июня 2019

Я думаю, вам следует удалить setHasFixedSize(true) или заменить его на setHasFixedSize(false)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...