Java 在什么点可以获得RecyclerView中视图的宽度?
我在用回收器。我需要将视图的高度设置为容器的宽度。但问题是,当我试图得到宽度大小时,它似乎还不存在,所以它返回零。如何确保已创建视图以获取其值并在设置高度时使用它 这就是我设置高度的代码Java 在什么点可以获得RecyclerView中视图的宽度?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我在用回收器。我需要将视图的高度设置为容器的宽度。但问题是,当我试图得到宽度大小时,它似乎还不存在,所以它返回零。如何确保已创建视图以获取其值并在设置高度时使用它 这就是我设置高度的代码 imageView.getLayoutParams().height = container.getWidth(); imageView.requestLayout(); 适配器的代码 public class OnlineUsersAdapter extends RecyclerView.A
imageView.getLayoutParams().height = container.getWidth();
imageView.requestLayout();
适配器的代码
public class OnlineUsersAdapter extends RecyclerView.Adapter<OnlineUsersAdapter.OnlineUserViewHolder> {
private List<OnlineUser> onlineUsers = new ArrayList<>();
private OnItemClickListener.OnItemClickCallback onItemClickCallback;
private OnItemClickListener.OnItemClickCallback onChatClickCallback;
private OnItemClickListener.OnItemClickCallback onLikeClickCallback;
private Context context;
public OnlineUsersAdapter(OnItemClickListener.OnItemClickCallback onItemClickCallback,
OnItemClickListener.OnItemClickCallback onChatClickCallback,
OnItemClickListener.OnItemClickCallback onLikeClickCallback) {
this.onItemClickCallback = onItemClickCallback;
this.onChatClickCallback = onChatClickCallback;
this.onLikeClickCallback = onLikeClickCallback;
}
public void addUsers(List<OnlineUser> userList) {
onlineUsers.addAll(userList);
notifyItemRangeInserted(onlineUsers.size() - userList.size(), onlineUsers.size());
}
public void clearData(List<OnlineUser> userList){
int oldSize = userList.size();
onlineUsers = userList;
notifyItemRangeRemoved(0, oldSize);
notifyItemRangeInserted(0, userList.size());
}
@NonNull
@Override
public OnlineUsersAdapter.OnlineUserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
context = parent.getContext();
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user, parent, false);
return new OnlineUsersAdapter.OnlineUserViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull OnlineUsersAdapter.OnlineUserViewHolder holder, int position) {
OnlineUser user = onlineUsers.get(position);
holder.bind(user, position);
}
@Override
public int getItemCount() {
return onlineUsers.size();
}
class OnlineUserViewHolder extends RecyclerView.ViewHolder {
RelativeLayout container;
ImageView imageView, likeBtn, chatBtn;
TextView name, country;
private LottieAnimationView animationView;
OnlineUserViewHolder(View itemView) {
super(itemView);
context = itemView.getContext();
container = itemView.findViewById(R.id.item_user_container);
imageView = itemView.findViewById(R.id.user_img);
likeBtn = itemView.findViewById(R.id.search_btn_like);
chatBtn = itemView.findViewById(R.id.search_btn_chat);
name = itemView.findViewById(R.id.user_name);
country = itemView.findViewById(R.id.user_country);
animationView = itemView.findViewById(R.id.lottieAnimationView);
}
void bind(OnlineUser user, int position) {
ViewCompat.setTransitionName(imageView, user.getName());
if (FirebaseUtils.isUserExist() && user.getUid() != null) {
new FriendRepository().isLiked(user.getUid(), flag -> {
if (flag) {
likeBtn.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_favorite));
animationView.setVisibility(View.VISIBLE);
} else {
likeBtn.setBackground(ContextCompat.getDrawable(context, R.drawable.heart_outline));
animationView.setVisibility(View.GONE);
}
});
}
if (user.getUid() != null) {
chatBtn.setOnClickListener(new OnItemClickListener(position, onChatClickCallback));
likeBtn.setOnClickListener(new OnItemClickListener(position, onLikeClickCallback));
}
imageView.setOnClickListener(new OnItemClickListener(position, onItemClickCallback));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
if (user.getImage().equals(Consts.DEFAULT)) {
Glide.with(context).load(context.getResources().getDrawable(R.drawable.default_avatar)).into(imageView);
} else {
Glide.with(context).load(user.getImage()).thumbnail(0.5f).into(imageView);
}
country.setText(user.getCountry());
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(500);
animator.addUpdateListener(valueAnimator ->
animationView.setProgress((Float) valueAnimator.getAnimatedValue()));
if (animationView.getProgress() == 0f) {
animator.start();
} else {
animationView.setProgress(0f);
}
imageView.getLayoutParams().height = 500;
imageView.requestLayout();
}
}
公共类OnlineUsersAdapter扩展了RecyclerView.Adapter{
private List onlineUsers=new ArrayList();
私有OnItemClickListener.OnItemClickCallback OnItemClickCallback;
私有OnItemClickListener.OnItemClickCallback onChatClickCallback;
私有OnItemClickListener.OnItemClickCallback onlyClickCallback;
私人语境;
公共OnlineUsersAdapter(OnItemClickListener.OnItemClickCallback OnItemClickCallback,
OnItemClickListener.OnItemClickCallback onChatClickCallback,
OnItemClickListener.OnItemClickCallback(仅限ClickCallback){
this.onItemClickCallback=onItemClickCallback;
this.onChatClickCallback=onChatClickCallback;
this.onlikelickcallback=onlikelickcallback;
}
public void addUsers(List userList){
addAll(userList);
notifyItemRangeInserted(onlineUsers.size()-userList.size(),onlineUsers.size());
}
公共无效clearData(列表用户列表){
int oldSize=userList.size();
onlineUsers=用户列表;
notifyItemRangeRemoved(0,旧尺寸);
notifyItemRangeInserted(0,userList.size());
}
@非空
@凌驾
public OnlineUsersAdapter.OnlineUserViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
context=parent.getContext();
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.item_user,parent,false);
返回新的OnlineUsersAdapter.OnlineUserViewHolder(v);
}
@凌驾
public void onBindViewHolder(@NonNull OnlineUsersAdapter.OnlineUserViewHolder,int位置){
OnlineUser=onlineUsers.get(位置);
绑定(用户、位置);
}
@凌驾
public int getItemCount(){
返回onlineUsers.size();
}
类OnlineUserViewHolder扩展了RecyclerView.ViewHolder{
相对长度容器;
ImageView ImageView,如EBTN、chatBtn;
TextView名称、国家/地区;
私有LottieAnimationView动画视图;
OnlineUserViewHolder(查看项目视图){
超级(项目视图);
context=itemView.getContext();
container=itemView.findviewbyd(R.id.item\u user\u container);
imageView=itemView.findViewById(R.id.user\u img);
likeBtn=itemView.findviewbyd(R.id.search\u btn\u like);
chatBtn=itemView.findviewbyd(R.id.search\u btn\u chat);
name=itemView.findviewbyd(R.id.user\u name);
country=itemView.findviewbyd(R.id.user\u country);
animationView=itemView.findViewById(R.id.lottieAnimationView);
}
无效绑定(OnlineUser,int位置){
setTransitionName(imageView,user.getName());
if(FirebaseUtils.isUserExist()&&user.getUid()!=null){
新建FriendRepository().isLiked(user.getUid(),标志->{
国际单项体育联合会(旗){
例如,setBackground(ContextCompat.getDrawable(context,R.drawable.ic_favorite));
设置可见性(View.VISIBLE);
}否则{
类似于挫折背景(ContextCompat.getDrawable(context,R.drawable.heart_outline));
animationView.setVisibility(View.GONE);
}
});
}
if(user.getUid()!=null){
setOnClickListener(新的OnItemClickListener(位置,onChatClickCallback));
比如setOnClickListener(新的OnItemClickListener(位置,onLikeClickCallback));
}
setOnClickListener(新的OnItemClickListener(位置,onItemClickCallback));
imageView.setScaleType(imageView.ScaleType.FIT_XY);
if(user.getImage().equals(Consts.DEFAULT)){
将(context.getResources().getDrawable(R.drawable.default_avatar))加载到(imageView);
}否则{
Glide.with(context).load(user.getImage()).缩略图(0.5f).into(imageView);
}
country.setText(user.getCountry());
ValueAnimator animator=ValueAnimator.offload(0f,1f).设置持续时间(500);
animator.addUpdateListener(值animator->
animationView.setProgress((Float)valueAnimator.getAnimatedValue());
if(animationView.getProgress()==0f){
animator.start();
}否则{
animationView.setProgress(0f);
}
imageView.getLayoutParams().height=500;
requestLayout();
}
}
}等待视图在UI上呈现。有几种方法可以做到这一点。其中之一是使用要获取高度的视图的
post()
像
这是一篇令人惊叹的文章,其中也包含了一些Kotlin解决方案,它们比Java更容易。在这里查看我的答案:
container.post(new Runnable() {
@Override
public void run() {
imageView.getLayoutParams().height = container.getWidth();
imageView.requestLayout();
}
});