簡體   English   中英

notifyDataSetChanged() 將 recyclerview 清空

[英]notifyDataSetChanged() blanks out recyclerview

我有一個問題,響應調用中的 notifyDataSetChanged() 將清空 recyclerview,但如果使用 onClick 手動啟動適配器,則 recyclerview 工作。 在調用 notifyDataSetChanged() 之前,我已經測試過 List 里面有項目,所以我不確定這里有什么問題。

[主要活動] 這有效,但我必須手動單擊 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:為垃圾編碼道歉,因為這是自學和修改網上找到的一些代碼。

問題很可能是,當您調用initRCV_Main()您將適配器設置為列表,如rcvMainAdp = new rcvMainAdapter(cList); 當列表更改並將其設置為適配器時,它會起作用。

但是當你調用getCoinData()rcvMainAdp.notifyDataSetChanged(); 最后,在再次單擊initRCV_Main()之前,您永遠不會將更改的列表設置到適配器。

所以也許修復是調用rcvMainAdp = new rcvMainAdapter(cList)然后rcvMainAdp.notifyDataSetChanged();

刪除此響應。

   cList.clear();

在響應中添加此行

rcvMainAdp.setdata(listSorter);

在 rcvMainAdp Adapter 中,創建一個方法 setdata()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM