【问题标题】:notifyDataSetChanged() blanks out recyclerviewnotifyDataSetChanged() 清除 recyclerview
【发布时间】:2021-07-13 10:56:22
【问题描述】:

我有一个问题,响应调用中的 notifyDataSetChanged() 将清除 recyclerview,但如果使用 onClick 手动启动适配器,则 recyclerview 可以工作。在调用 notifyDataSetChanged() 之前,我已经测试了 List 里面有项目,所以我不确定这里有什么问题。

[Main Activity] 这可行,但我必须手动单击 bnQuery。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        apiInterface = API_client.getClient().create(APIInterface.class);

        etCoin = (EditText) findViewById(R.id.etCoin);
        bnQuery = (Button) findViewById(R.id.bnQuery);

        rcvMain = findViewById(R.id.rcvMain);


        getCoinData("2");
        //initRCV_Main();


        bnQuery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //getCoinData("2");
                initRCV_Main();

            }
        });
    }

    private void initRCV_Main() {

        rcvMainAdp = new rcvMainAdapter(cList);
        rcvMain.setAdapter(rcvMainAdp);
        rcvMain.setLayoutManager(new LinearLayoutManager(this));

    }

    private void getCoinData(String coinLimit){

        Call<cInfoPack> call = apiInterface.doGetCoinData(coinLimit);
        call.enqueue(new Callback<cInfoPack>() {
            @Override
            public void onResponse(Call<cInfoPack> call, Response<cInfoPack> response) {

                cInfoPack list = response.body();
                List<cData> listSorter = new ArrayList<>();
                listSorter.addAll(list.getData());
                Collections.sort(listSorter, new SortbyVolChg());

                cList.clear();
                cList = listSorter;

                System.out.println("list " + list.getData().get(0).getQuote());
                System.out.println("listSorter " + listSorter.get(0).getQuote());
                System.out.println("cList " + cList.get(0).getQuote());

                //rcvMainAdp.notifyDataSetChanged();

            }

            @Override
            public void onFailure(Call<cInfoPack> call, Throwable t) {
                Toast.makeText(MainActivity.this, "onFailure", Toast.LENGTH_SHORT).show();
                Log.d("XXXX", t.getLocalizedMessage());
                call.cancel();
            }
        });

    }

[主要活动] 如果我在 onCreate 期间启动 recyclerview 并在 getCoinData 期间使用 notifyDataSetChanged(),我会得到一个空白的 recycleview。 system.out 显示列表中都包含信息。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        apiInterface = API_client.getClient().create(APIInterface.class);

        etCoin = (EditText) findViewById(R.id.etCoin);
        bnQuery = (Button) findViewById(R.id.bnQuery);

        rcvMain = findViewById(R.id.rcvMain);


        getCoinData("2");
        initRCV_Main();


        bnQuery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //getCoinData("2");
                //initRCV_Main();

            }
        });
    }

    private void initRCV_Main() {

        rcvMainAdp = new rcvMainAdapter(cList);
        rcvMain.setAdapter(rcvMainAdp);
        rcvMain.setLayoutManager(new LinearLayoutManager(this));

    }

    private void getCoinData(String coinLimit){

        Call<cInfoPack> call = apiInterface.doGetCoinData(coinLimit);
        call.enqueue(new Callback<cInfoPack>() {
            @Override
            public void onResponse(Call<cInfoPack> call, Response<cInfoPack> response) {

                cInfoPack list = response.body();
                List<cData> listSorter = new ArrayList<>();
                listSorter.addAll(list.getData());
                Collections.sort(listSorter, new SortbyVolChg());

                cList.clear();
                cList = listSorter;

                System.out.println("list " + list.getData().get(0).getQuote());
                System.out.println("listSorter " + listSorter.get(0).getQuote());
                System.out.println("cList " + cList.get(0).getQuote());

                rcvMainAdp.notifyDataSetChanged();

            }

            @Override
            public void onFailure(Call<cInfoPack> call, Throwable t) {
                Toast.makeText(MainActivity.this, "onFailure", Toast.LENGTH_SHORT).show();
                Log.d("XXXX", t.getLocalizedMessage());
                call.cancel();
            }
        });

    }

[适配器]

public class rcvMainAdapter extends RecyclerView.Adapter<rcvMainAdapter.ViewHolder> {

    private List<cData> idxCoin;

    //ItemClickListener itemClickListener;

    rcvMainAdapter(List<cData> data) {this.idxCoin = data;}
    @NonNull
    @NotNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {

        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.rcv_main,parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull ViewHolder holder, int position) {

        cData cdata = idxCoin.get(position);

        TextView tvSym = holder.tvSymbol;
        tvSym.setText(cdata.getSymbol());

        TextView tvQuo = holder.tvQuote;
        BigDecimal tvQuote_BD = new BigDecimal(cdata.getQuote().getuSD().getPrice().toString());
        tvQuote_BD.setScale(6, RoundingMode.DOWN);
        tvQuo.setText(tvQuote_BD.toString());

        TextView tvV24 = holder.tvVolume24;
        BigDecimal tvVolume24_BD = new BigDecimal(cdata.getQuote().getuSD().getVolume24h().toString());
        BigInteger tvVolume24_BI = tvVolume24_BD.toBigInteger();
        tvV24.setText(tvVolume24_BI.toString());

    }

    @Override
    public int getItemCount() {
        return idxCoin.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView tvSymbol, tvQuote, tvVolume24;

        public ViewHolder(@NonNull @NotNull View itemView) {
            super(itemView);

            tvSymbol = itemView.findViewById(R.id.tvSymbol);
            tvQuote = itemView.findViewById(R.id.tvQuote);
            tvVolume24 = itemView.findViewById(R.id.tvVolume24);

            //itemView.setOnClickListener(this);

        }

    }

    /*
    public interface ItemClickListener{
        void onItemClick(View view, int position);

    }

     */

}

PS:对于垃圾编码表示歉意,因为这是自学并修改了网上找到的一些代码。

【问题讨论】:

  • 你的变量名真的很混乱,希望它们对你更有意义,以后没有其他人需要查看这段代码:) 不知道为什么东西以c为前缀。据我所知,我看不到您如何更改适配器的内容。你没有像adapter.items = foo 这样的东西,然后是通知声明

标签: java android android-recyclerview


【解决方案1】:

删除此作为回应。

   cList.clear();

添加此行作为响应

rcvMainAdp.setdata(listSorter);

在 rcvMainAdp 适配器中,创建一个方法 setdata()

    public void setdata(ArrayList<cData> data) {
   
       this.idxCoin = data;
       
       notifyDataSetChanged();
    }

【讨论】:

  • 太棒了!这解决了它。但是为什么“rcvMainAdapter(List data) {this.idxCoin = data;}”行在适配器中不起作用?抱歉,我仍在试图弄清楚整个流程是如何工作的。
  • 如果这解决了它接受答案。问题是 cList = listSorter;作为回应。请学习 Java 中的“=”。你会明白的。这是任务。您正在清除适配器列表,然后您没有更新适配器中的列表。相反,您正在分配活动。 listSorder 和 clist 指向内存中的同一个列表,但适配器内的列表是旧的,它是空的,为什么没有数据。
  • 非常感谢您的解释!这阐明了我对工作的理解。是的,在我介绍 listsorter 方法并做了其他一些事情之前它正在正常工作,但不确定是什么原因造成的。
  • 问题是 idxCoin 在您执行此操作时为空 cList.clear(); .你没有更新它。你做了这个 cList = listSorter。那是错误的
【解决方案2】:

问题很可能是,当您调用initRCV_Main() 时,您将适配器设置为rcvMainAdp = new rcvMainAdapter(cList); 中的列表,而当列表更改并将其设置为适配器时,它会起作用。

但是当您最后调用getCoinData()rcvMainAdp.notifyDataSetChanged(); 时,您永远不会将更改的列表设置为适配器,直到您再次单击initRCV_Main()

所以也许修复是调用rcvMainAdp = new rcvMainAdapter(cList) 然后 rcvMainAdp.notifyDataSetChanged();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2021-07-05
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多