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 楼答案
{}的任务是维护不同视图(本例中为100个)的可用性。这对设备性能来说太疯狂了,所以
RecyclerView
会以10比10(或其他任何形式)对它们进行“回收”。这10个不同元素中的每一个都会调用NumberViewHolder
,因此当您单击它时,系统知道引用了哪个元素这就是您在其上设置
itemView.setOnClickListener(this);
的原因,因为每个View
都必须有自己的从Android Developers Guide开始:
RecyclerView.ViewHolder
因此,您要为
View
设置的所有内容都必须在其中定义,然后RecyclerView
将为所有项目应用它编辑:这里有一个类似的问题,我在一年多前问过同样的问题:Click an ImageButton which belongs to a CardView inside a RecyclerView