有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在recyclerView点击处理中这是什么?

我不知道点击处理在这里是如何工作的。为什么我们要将this从主活动设置为GreenAdapter构造函数,并将ListItemClickListener mOnClickListener设置为this

点击处理在RecyclerView中的具体工作方式

NumberViewHolder在这里只被创建或调用了10次,它在100个项目视图中的其余部分被循环使用。那么onClick(视图v)是如何在100个不同的列表项视图之间进行区分的呢。我们只设置itemView。创建的10个项目视图上的setOnClickListener

public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder> {

    private static final String TAG = GreenAdapter.class.getSimpleName();


    final private ListItemClickListener mOnClickListener;


    private static int viewHolderCount;

    private int mNumberItems;


    public interface ListItemClickListener {
        void onListItemClick(int clickedItemIndex);
    }


    public GreenAdapter(int numberOfItems, ListItemClickListener listener) {
        mNumberItems = numberOfItems;
        mOnClickListener = listener;
        viewHolderCount = 0;
    }


    @Override
    public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        Context context = viewGroup.getContext();
        int layoutIdForListItem = R.layout.number_list_item;
        LayoutInflater inflater = LayoutInflater.from(context);
        boolean shouldAttachToParentImmediately = false;

        View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
        NumberViewHolder viewHolder = new NumberViewHolder(view);

        viewHolder.viewHolderIndex.setText("ViewHolder index: " + viewHolderCount);

        int backgroundColorForViewHolder = ColorUtils
                .getViewHolderBackgroundColorFromInstance(context, viewHolderCount);
        viewHolder.itemView.setBackgroundColor(backgroundColorForViewHolder);

        viewHolderCount++;
        Log.d(TAG, "onCreateViewHolder: number of ViewHolders created: "
                + viewHolderCount);
        return viewHolder;
    }


    @Override
    public void onBindViewHolder(NumberViewHolder holder, int position) {
        Log.d(TAG, "#" + position);
        holder.bind(position);
    }


    @Override
    public int getItemCount() {
        return mNumberItems;
    }


    class NumberViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener {

        // Will display the position in the list, ie 0 through getItemCount() - 1
        TextView listItemNumberView;
        // Will display which ViewHolder is displaying this data
        TextView viewHolderIndex;


        public NumberViewHolder(View itemView) {
            super(itemView);

            listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number);
            viewHolderIndex = (TextView) itemView.findViewById(R.id.tv_view_holder_instance);

            itemView.setOnClickListener(this);
        }


        void bind(int listIndex) {
            listItemNumberView.setText(String.valueOf(listIndex));
        }



        @Override
        public void onClick(View v) {
            int clickedPosition = getAdapterPosition();
            mOnClickListener.onListItemClick(clickedPosition);
        }
    }
}

在主要活动中,我有

public class MainActivity extends AppCompatActivity
        implements GreenAdapter.ListItemClickListener {
...
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mNumbersList = (RecyclerView) findViewById(R.id.rv_numbers);


        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mNumbersList.setLayoutManager(layoutManager);


        mNumbersList.setHasFixedSize(true);


        mAdapter = new GreenAdapter(NUM_LIST_ITEMS, this);
        mNumbersList.setAdapter(mAdapter);
    }
 @Override
    public void onListItemClick(int clickedItemIndex) {

        if (mToast != null) {
            mToast.cancel();
        }


        String toastMessage = "Item #" + clickedItemIndex + " clicked.";
        mToast = Toast.makeText(this, toastMessage, Toast.LENGTH_LONG);

        mToast.show();
    }
...
}

共 (1) 个答案

  1. # 1 楼答案

    {}的任务是维护不同视图(本例中为100个)的可用性。这对设备性能来说太疯狂了,所以RecyclerView会以10比10(或其他任何形式)对它们进行“回收”。这10个不同元素中的每一个都会调用NumberViewHolder,因此当您单击它时,系统知道引用了哪个元素

    这就是您在其上设置itemView.setOnClickListener(this);的原因,因为每个View都必须有自己的

    Android Developers Guide开始:

    RecyclerView.ViewHolder

    A ViewHolder describes an item view and metadata about its place within the RecyclerView.

    因此,您要为View设置的所有内容都必须在其中定义,然后RecyclerView将为所有项目应用它

    编辑:这里有一个类似的问题,我在一年多前问过同样的问题:Click an ImageButton which belongs to a CardView inside a RecyclerView