我有一个自定义的RecyclerView适配器,该适配器从包含9个固定数据点的onCreate方法实例化:

    GridRecyclerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...

        /* Dummy cell data */
        String[] data = {"", "", "", "", "", "", "", "", ""};

        ...

        /* Init RecyclerView */
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        int numColumns = 3;
        recyclerView.setLayoutManager(new GridLayoutManager(this, numColumns));
        adapter = new GridRecyclerAdapter(this, data, numColumns, player1, player2);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }


单击后,ViewHolder中的clickListener会将文本设置为“ X”。

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView cellTextView;

        ViewHolder(View itemView) {
            super(itemView);
            cellTextView = (TextView) itemView.findViewById(R.id.textView);
            itemView.setOnClickListener(v -> {
                /* Set cell TextView to "X" */
                cellTextView.setText("X");
            });
        }
    }


每次单击时,我要检查itemViews的特定组合是否具有特定值。例如,如果位置1、2和3的itemViews的TextView等于“ X”,则显示AlertDialog。我想我应该能够通过每次单击修改在构造函数中传递的String []。

最佳答案

setOnClickListener中提取ViewHolder并将其移至Adapter's onBindViewHolder
将检查的位置保持某种形式(例如整数数组)
当您在其中一个X上设置Views时,请查看所检查位置的更改是否对显示您的AlertDialog有效。




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

    List<Integer> xPositions = new ArrayList<>();

    // ... all the needed stuff.

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.itemView.setOnClickListener(v -> {
            holder.showX();
            xPositions.add(holder.getAdapterPosition());
            checkIfShouldShowAlert();
        });
    }

    void checkIfShouldShowAlert() {
        // do your checks on xPositions and show the AlertDialog if needed
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView cellTextView;

        ViewHolder(View itemView) {
            super(itemView);
            cellTextView = (TextView) itemView.findViewById(R.id.textView);
        }

        void showX(){
            cellTextView.setText("X");
        }
    }
}


请记住要添加一种机制,以防止连续单击相同的视图(否则xPositions数组会越来越大)。

10-06 07:22
查看更多