Android RecycleView仅第一次显示数据

Android RecycleView仅第一次显示数据,android,android-recyclerview,Android,Android Recyclerview,我有一个RecycleView,我给它一个Post对象的Array。第一次加载时,一切正常,但尝试替换数据或再次输入片段,则回收视图不会显示任何内容。我还检查了新数据的大小,它不同于零。这是我的密码: // Init the list list = (RecyclerView) view.findViewById(R.id.list); list.setLayoutManager(new LinearLayoutManager(mContext));

我有一个
RecycleView
,我给它一个
Post
对象的
Array
。第一次加载时,一切正常,但尝试替换数据或再次输入
片段
,则
回收视图
不会显示任何内容。我还检查了新数据的大小,它不同于零。这是我的密码:

// 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();
}
//初始化列表
list=(RecyclerView)view.findViewById(R.id.list);
list.setLayoutManager(新的LinearLayoutManager(mContext));
...
if(适配器!=null){
replaceCurrentPosts(新的ArrayList(postList));
} 
否则{
adapter=newpostadapter(mContext、newarraylist(postList)、this);
list.setAdapter(适配器);
}
...
公共PostAdapter(上下文上下文、列表帖子、onPostElementClickListener侦听器){
this.context=上下文;
这个.posts=posts;
this.mListener=侦听器;
}
公共职位(列出新职位){
this.posts.clear();
this.posts.addAll(newPosts);
this.notifyDataSetChanged();
}
@凌驾
public int getItemCount(){
返回后。大小();
}

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

package com.example.jiteshmohite.myapplication

公共类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 on PostElement ClickListener MLListener;
//提供对每个数据项的视图的引用
//复杂数据项可能需要每个项有多个视图,并且
//您可以访问视图持有者中数据项的所有视图
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
//在本例中,每个数据项只是一个字符串
公共文本视图mTextView;
公共视图持有者(视图v){
超级(五);
mTextView=(TextView)v.findViewById(R.id.info_text);
}
}
公共PostAdapter(上下文上下文、列表帖子、OnPostElement ClickListener侦听器){
this.context=上下文;
这个.posts=posts;
this.mListener=侦听器;
}
公共无效替换当前帖子(列出新帖子){
posts.clear();
职位=新职位;
this.notifyDataSetChanged();
}
@凌驾
public PostAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
//创建新视图
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.my_text_视图,父视图,false);
//设置视图的大小、边距、填充和布局参数
视窗支架vh=新视窗支架(v);
返回vh;
}
@凌驾
BindViewHolder上的公共无效(PostAdapter.ViewHolder,最终int位置){
//-在此位置从数据集中获取元素
//-用该元素替换视图的内容
holder.mTextView.setText(posts.get(position.getName());
holder.mTextView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mListener.onClick(位置);
}
});
}
@凌驾
public int getItemCount(){
返回后。大小();
}
PostElement上的界面ClickListener{
公共void onClick(intpos);
}
}

私有回收视图列表;
私人后适配器后适配器;
private RecyclerView.LayoutManager LayoutManager;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u recycler\u示例);
list=(RecyclerView)findViewById(R.id.list);
layoutManager=新的LinearLayoutManager(getApplicationContext());
list.setLayoutManager(layoutManager);
postAdapter=新的postAdapter(getApplicationContext(),getPostData(),listener);
list.setAdapter(postAdapter);
}
private PostAdapter.OnPostElement ClickListener listener=新建PostAdapter.OnPostElement ClickListener(){
@凌驾
公共void onClick(内部位置){
Toast.makeText(getApplicationContext(),pos+“”,Toast.LENGTH_SHORT).show();
List posts=getPostData();
posts.get(pos.setName)(“abc”);
postAdapter.replaceCurrentPosts(posts);
}
};
//获取包含名称的帖子列表
公共列表getPostData(){
Post Post=新Post();
post.setName(“xyz”);
List posts=new ArrayList();
增加(员额);
增加(员额);
增加(员额);
增加(员额);
增加(员额);
返回岗位;
}
}

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


如果它不适合您,请告诉我。

adapter.replaceCurrentPosts(postList);因为postList是collection,所以应该强制转换。在强制转换之后,您检查了列表是否为空?是的,我检查了。列表不是空的。我调试了好几次。
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;
}