一個標(biāo)準(zhǔn)的創(chuàng)建方法:
Object為你要adapter的類
class MyAdapter extends ListAdapter<Object, MyAdapter.MyViewHolder> {
protected MyAdapter(@NonNull DiffUtil.ItemCallback<PhotoItem> diffCallback) {
super(new DiffUtil.ItemCallback<Object>() { // 差異化比較
@Override
public boolean areItemsTheSame(@NonNull PhotoItem oldItem, @NonNull PhotoItem newItem) {
return false; //比如oldItem.getId() == newItem.getId();比較Object里的id
}
@Override
public boolean areContentsTheSame(@NonNull PhotoItem oldItem, @NonNull PhotoItem newItem) {
return false; // 比如 (oldItem.getWord().equals(newItem.getWord()))
// &&(oldItem.getTranslate().equals(newItem.getTranslate()));
//比較Object里的word和translate
}
});
}
static class MyViewHolder extends RecyclerView.ViewHolder {
// 這里定義ui組件
// TextView tvNum;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
// 這里放ui組件
// tvNum = itemView.findViewById(R.id.tv_num);
}
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.item_layout, parent, false); // 這里為item的layout
MyViewHolder myViewHolder = new MyViewHolder(itemView);
// 這里寫你要設(shè)置的監(jiān)聽器
// 可以用tag的方式從下面取數(shù)據(jù),比如:
// Word word = (Word) myViewHolder.itemView.getTag(R.id.word_tag);
// 也可以直接getItem獲得當(dāng)前顯示內(nèi)容的Object對象
// Word word = getItem(myViewHolder.getAdapterPosition());
return myViewHolder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
// 這里就發(fā)揮你的想象力綁定ui控件了
// 若有tag:
// holder.itemView.setTag(R.id.word_tag ,word);
}
}
Tag放values - id.xml:
<resources>
<item name="word_tag" type="id"/>
</resources>
備份一個案例:
/**
* Created by kusunoki on 2020/5/14 0014 17:48.
*/
class MyAdapter extends ListAdapter<PhotoItem, MyAdapter.MyViewHolder> {
protected MyAdapter() {
super(new DiffUtil.ItemCallback<PhotoItem>() {
@Override
public boolean areItemsTheSame(@NonNull PhotoItem oldItem, @NonNull PhotoItem newItem) {
return oldItem.getId() == newItem.getId();
}
@Override
public boolean areContentsTheSame(@NonNull PhotoItem oldItem, @NonNull PhotoItem newItem) {
return oldItem.getPreviewURL().equals(newItem.getPreviewURL());
}
});
}
static class MyViewHolder extends RecyclerView.ViewHolder {
ShimmerLayout shimmerLayout;
ImageView imageView;
MyViewHolder(@NonNull View itemView) {
super(itemView);
shimmerLayout = itemView.findViewById(R.id.shimmerLayout);
imageView = itemView.findViewById(R.id.imageView2);
}
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
final View itemView = inflater.inflate(R.layout.item_photo, parent, false);
final MyViewHolder myViewHolder = new MyViewHolder(itemView);
myViewHolder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 這里得到了當(dāng)前顯示內(nèi)容的PhotoItem對象
PhotoItem photoItem = getItem(myViewHolder.getAdapterPosition());
Bundle bundle = new Bundle();
bundle.putParcelable("data",photoItem);
NavController navController = Navigation.findNavController(itemView);
navController.navigate(R.id.action_galleryFragment_to_photoFragment, bundle);
}
});
return myViewHolder;
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
holder.shimmerLayout.setShimmerColor(0x55ffffff);
holder.shimmerLayout.setShimmerAngle(0);
holder.shimmerLayout.startShimmerAnimation();
Glide.with(holder.itemView)
.load(getItem(position).getPreviewURL())
.placeholder(R.drawable.ic_launcher_background)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
if (holder.shimmerLayout != null) {
holder.shimmerLayout.stopShimmerAnimation();
}
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
if (holder.shimmerLayout != null) {
holder.shimmerLayout.stopShimmerAnimation();
}
return false;
}
})
.into(holder.imageView);
}
}