1.数据调用notifyDataSetChanged()刷新数据之后不显示item,正确用法应该是清空数据之后再放入数据:
public void setData(List mlist) {
list.clear();
list.addAll(mlist);
Log.i(TAG, "setData: "+list.toString());
notifyDataSetChanged();
}
错误做法是直接把list对象替换:(list = mlist)
调用notifyDataSetChanged出现ListView不刷新问题根源在于mList指向了其他内存空间,而不是修改了原指向内存空间内容。
2.某个item被初始化之后宽高被固定
在创建viewholder传入的View时,如果不指定其viewgroup,就会出现宽高只包裹显示内容的问题。
View view = LayoutInflater.from(context).inflate(R.layout.test_test,null);
上面的做法就会出问题
改成这样就可以正常显示设置的宽高
View view = LayoutInflater.from(context).inflate(R.layout.test_test,parent,false);
再贴一个adapter模板
package com.example.globalsearchdemo;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class SearchInfoListAdapter extends RecyclerView.Adapter<SearchInfoListAdapter.SearchInfoViewHolder> {
private static final String TAG = "SearchInfoListAdapter";
private Context context;
private List<SearchInfo> list = new ArrayList<>();
private OnRecyclerItemClickListener itemClickListener;
public SearchInfoListAdapter (Context context) {
this.context = context;
}
@NonNull
@Override
public SearchInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//View view = View.inflate(parent.getContext(), R.layout.adapter_searchinfo_item, null);
View view = LayoutInflater.from(context).inflate(R.layout.adapter_searchinfo_item,parent,false);
return new SearchInfoViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SearchInfoViewHolder holder, int position) {
holder.textView.setText(list.get(position).getName());
//Log.i(TAG, "onBindViewHolder: " + list.get(position).getName());
holder.searchItem.setOnClickListener(view -> {
if (itemClickListener != null) {
itemClickListener.onItemClick(position, list.get(position));
}
});
}
public static class SearchInfoViewHolder extends RecyclerView.ViewHolder {
ConstraintLayout searchItem;
TextView textView;
public SearchInfoViewHolder(@NonNull View itemView) {
super(itemView);
searchItem = itemView.findViewById(R.id.search_item_content);
textView = itemView.findViewById(R.id.tv_name);
}
}
@Override
public int getItemCount() {
if (list != null) {
return list.size();
}
return 0;
}
public void setItemClickListener(OnRecyclerItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
public void setData(List mlist) {
list.clear();
list.addAll(mlist);
Log.i(TAG, "setData: "+list.toString());
notifyDataSetChanged();
}
public interface OnRecyclerItemClickListener {
//RecyclerView的点击事件,将信息回调给view
void onItemClick(int position, SearchInfo item);
}
}
//activity使用
searchListRecyclerView = findViewById(R.id.searchinfolist);
searchInfoListAdapter = new SearchInfoListAdapter(this);
searchInfoListAdapter.setItemClickListener(this);
mLayoutManager = new LinearLayoutManager(this);
searchListRecyclerView.setLayoutManager(mLayoutManager);
searchListRecyclerView.setAdapter(searchInfoListAdapter);
searchInfoListAdapter.setData(list);
okkkk~
参考文章:
Android中RecyclerView的item宽高问题详解_recyclerview获取item的高度_今人不见古时月,今月曾经照古人的博客-CSDN博客
调用notifyDataSetChanged之后listview不刷新_android listview 要点击一下才能显示刷新的数据_Android高级知识分享官的博客-CSDN博客