Reputation: 15
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).
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
Reputation: 3613
I think you should remove setHasFixedSize(true)
or replace it with setHasFixedSize(false)
Upvotes: 1