Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在recyclerView点击处理中这是什么?_Java_Android - Fatal编程技术网

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

Java 在recyclerView点击处理中这是什么?,java,android,Java,Android,我不知道点击处理在这里是如何工作的。为什么我们要将this从主活动设置为GreenAdapter构造函数,并将ListItemClickListener mOnClickListener设置为this 点击处理在RecyclerView中的具体工作方式 NumberViewHolder在这里只被创建或调用了10次,它在100个项目视图中的其余部分被循环使用。那么onClick(视图v)是如何在100个不同的列表项视图之间进行区分的呢。我们只在创建的10个项目视图上设置itemView.setOn

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

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

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

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

这就是为什么要设置
itemView.setOnClickListener(This)在它上面,因为每个
视图都必须有自己的

从:

RecyclerView.ViewHolder

ViewHolder描述项目视图及其位置元数据 在RecyclerView中

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


编辑:这里有一个类似的问题,我在一年多前问过同样的问题:

Here
this
关键字用于提到实现的接口。实际上,它指的是一个MainActivity,它是一个ListItemClickListener。这是java基础。好的,谢谢。NumberViewHolder在这里只被创建或调用了10次,它在其余的项目视图中被循环使用。那么onClick(视图v)如何区分100种不同的列表项视图呢?为什么你要我们解释其他人的代码/为什么不问问编写代码的人?因为我在网上学习。所以我很难理解好的,谢谢,我还有一个问题。当我调用super(itemView)时,RecyclerView.ViewHolder类的最终itemView变量被初始化为我们在super调用中传递的itemView,对吗?因为您正在扩展另一个类的功能(
RecyclerView.ViewHolder
),您必须先“执行”父类方法,然后在自定义的
ViewHolder
中执行您想要的任何操作。所以你或多或少是对的。
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();
    }
...
}