RecycleView仅首次显示数据

时间:2016-10-25 07:23:12

标签: android android-recyclerview

我有RecycleView我向其提供了ArrayPost个对象。当它第一次加载时,一切正常但是尝试替换数据或只是再次输入Fragment然后RecycleView没有显示任何内容。我也检查了新数据的大小,它与零不同。这是我的代码:

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

2 个答案:

答案 0 :(得分:0)

package com.example.jiteshmohite.myapplication;

public class PostAdapter扩展了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;
}

}

我建议而不是notifyDataSetChanged()你应该参考notifyItemChange来修改特定的位置。

如果不适合你,请告诉我。

答案 1 :(得分:-1)

为什么不尝试添加一个元素(或者更多)而不是全部删除并重新添加所有项目?