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
将为所有项目应用它
编辑:这里有一个类似的问题,我在一年多前问过同样的问题:Herethis
关键字用于提到实现的接口。实际上,它指的是一个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();
}
...
}