我应该如何在具有列表大小的 RecyclerView Adapter 中初始化一个数组,而该列表在 Adapter 构造中不可用?

How should I initialize an array inside RecyclerView Adapter which has the size of a list while the list will not available on Adapter construction?

我有一个 RecyclerView,其中包含从 Internet 检索到的项目列表。所以一开始,列表是空的。从互联网上检索到数据后,它将更新列表并调用 notifyDataSetChanged().

我可以将数据改编成RecyclerView就好了。但是,我为每个项目都有一个 ImageButton,如果单击它,它具有不同的图像。如果我在 onBindViewHolder 中初始化标志数组,每次滚动 RecyclerView 时,标志数组将重新初始化为 false。如果我在 Adapter 构造函数中初始化它,它将是 0 索引,因为列表一开始是空的。如果数据会在一段时间后到达,我应该把数组初始化放在适配器的什么地方?

下面是我的代码,但是每次滚动 RecyclerView.

时,标志数组 (isTrue) 总是重新初始化

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

    private ArrayList<String> someList;
    private boolean[] isTrue;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView someText;
 public ImageButton someButton;

        public ViewHolder(View v) {
            super(v);
            someText = (TextView) v.findViewById(R.id.text);
     someButton = (ImageButton) v.findViewById(R.id.button);
        }
    }

    public SomethingAdapter(ArrayList<String> someList) {
        this.someList = someList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.some_layout, parent, false);

        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        //TODO: This thing will make isTrue always reinitialize if scrolled
        this.isTrue = new boolean[someList.getResults().size()];

        viewHolder.someText.setText(someList.get(position));

        if (isTrue[position]) {
            viewHolder.someButton.setImageResource(R.drawable.button_true);
        } else {
            viewHolder.someButton.setImageResource(R.drawable.button_false);
        }

        viewHolder.someButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isTrue[position]) {
                    //Connect to the internet and if response is positive {
                        //isTrue[position] = false;
                        //viewHolder.someButton.setImageResource(R.drawable.button_false);
                    //}
                } else {
                    //Connect to the internet and if response is positive {
                        //isTrue[position] = true;
                        //viewHolder.someButton.setImageResource(R.drawable.button_true);
                    //}
                }
            }

        });
    }

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

将项目添加到 someList 时初始化它。

此外,不要在您的 onBind 中添加点击侦听器,请在 onCreateViewHolder 中创建它。您不能在点击回调中使用位置,而应该使用 ViewHolder#getAdapterPosition。

有关详细信息,请参阅文档: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#onBindViewHolder(VH, 整数)