RecyclerView数据不更新,以及无法改变宽高

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博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值