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