0

I have a RecycleView to which I give an Array of Post objects. When it's loaded first time, everything works fine but trying to replace the data or just entering in the Fragment again then the RecycleView does not show anything. Also I have checked the size of the new data and it's different from zero. Here is my code:

// Init the list
list = (RecyclerView) view.findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(mContext));

                             ...


if (adapter != null) {
    adapter.replaceCurrentPosts(new ArrayList<>(postList));
} 
else {
    adapter = new PostAdapter(mContext, new ArrayList<>(postList), this);
    list.setAdapter(adapter);
}

                       ...

public PostAdapter(Context context, List<Post> posts, onPostElementClickListener listener) {    
    this.context = context;
    this.posts = posts;
    this.mListener = listener;
}

public void replaceCurrentPosts(List<Post> newPosts) {    
    this.posts.clear();
    this.posts.addAll(newPosts);
    this.notifyDataSetChanged();
}

@Override
public int getItemCount() {
    return posts.size();
}
vidulaJ
  • 1,082
  • 13
  • 30
charbinary
  • 1,495
  • 3
  • 13
  • 23

2 Answers2

0

package com.example.jiteshmohite.myapplication;

public class PostAdapter extends RecyclerView.Adapter {

private Context context;
private List<Post> posts;
private onPostElementClickListener mListener;

// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public TextView mTextView;
    public ViewHolder(View v) {
        super(v);
        mTextView = (TextView) v.findViewById(R.id.info_text);
    }
}

public PostAdapter(Context context, List<Post> posts, onPostElementClickListener listener) {
    this.context = context;
    this.posts = posts;
    this.mListener = listener;
}

public void replaceCurrentPosts(List<Post> newPosts) {
    posts.clear();
    posts = newPosts;
    this.notifyDataSetChanged();
}

@Override
public PostAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.my_text_view, parent, false);
    // set the view's size, margins, paddings and layout parameters
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(PostAdapter.ViewHolder holder, final int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    holder.mTextView.setText(posts.get(position).getName());
    holder.mTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mListener.onClick(position);
        }
    });

}

@Override
public int getItemCount() {
    return posts.size();
}
interface onPostElementClickListener {
    public void onClick(int pos);
}

}

private RecyclerView list;
private PostAdapter postAdapter;
private RecyclerView.LayoutManager layoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recycler_example);
    list = (RecyclerView) findViewById(R.id.list);
    layoutManager = new LinearLayoutManager(getApplicationContext());
    list.setLayoutManager(layoutManager);
    postAdapter = new PostAdapter(getApplicationContext(), getPostData(), listener);
    list.setAdapter(postAdapter);
}


private PostAdapter.onPostElementClickListener listener = new PostAdapter.onPostElementClickListener() {
    @Override
    public void onClick(int pos) {
        Toast.makeText(getApplicationContext(), pos + "" , Toast.LENGTH_SHORT).show();
        List<Post> posts = getPostData();
        posts.get(pos).setName("abc");
        postAdapter.replaceCurrentPosts(posts);
    }
};

// get post list which contains name
public List<Post> getPostData() {
    Post post = new Post();
    post.setName("xyz");
    List<Post> posts = new ArrayList<Post>();
    posts.add(post);
    posts.add(post);
    posts.add(post);
    posts.add(post);
    posts.add(post);
    return posts;
}

}

I suggesting rather then notifyDataSetChanged() you should refer notifyItemChange which modify specific positions.

please let me know if it is not work for you.

Jitesh Mohite
  • 15,430
  • 6
  • 71
  • 84
-1

why don't you try to add one element (or maybe more) instead of remove all and re-add all items?