起初,我在OnBindViewHolder中分配了clickListener,并且工作正常,但是在stackoverflow上的许多人都建议这不是一个好习惯,如果我在ViewHolder中处理所有单击侦听器逻辑,则更好。现在在OBVH中,我使用持有人的位置来获取当前商品的位置,但是在VH中,我什至没有使用任何位置或getAdapterPosition,但我仍在获取正确的商品位置。
ViewHolder:
private class NewsHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ImageView mImageView;
private TextView mTextView;
private Results mResults;
private NewsHolder(View itemView) {
super(itemView);
mImageView = itemView.findViewById(R.id.news_image);
mTextView = itemView.findViewById(R.id.news_headlines);
itemView.setOnClickListener(this);
}
public void bind(Results results){
mResults = results;
mTextView.setText(mResults.getWebTitle());
String picture = mResults.getFields().getThumbnail();
if (!picture.isEmpty()) {
Picasso.get()
.load(picture)
.placeholder(R.drawable.display)
.resize(200, 200)
.into(mImageView);
} else {
Picasso.get()
.load(R.drawable.display)
.resize(200, 200)
.into(mImageView);
}
}
@Override
public void onClick(View view){
String itemWebUrl = mResults.getWebUrl();
Uri currentItemUri = Uri.parse(itemWebUrl);
Intent websiteIntent = new Intent(Intent.ACTION_VIEW, currentItemUri);
view.getContext().startActivity(websiteIntent);
}
}
OnBindViewHolder
@Override
public void onBindViewHolder(@NonNull NewsHolder holder, int position) {
try {
Results results = mResults.get(position);
holder.bind(results);
} catch (Throwable throwable) {
Log.d(TAG, " " + throwable);
}
}
结果模型类:
public class Results{
@SerializedName("id")
@Expose
public String id;
@SerializedName("sectionId")
@Expose
private String sectionId;
@SerializedName("webTitle")
@Expose
private String webTitle;
@SerializedName("webUrl")
@Expose
private String webUrl;
@SerializedName("fields")
@Expose
private Fields fields;
public String getId(){
return id;
}
public String getSectionId(){
return sectionId;
}
public String getWebTitle(){
return webTitle;
}
public String getWebUrl(){
return webUrl;
}
public Fields getFields(){
return fields;
}
}
没有getAdapterPosition()是否有可能获得正确的物品位置?
答案 0 :(得分:0)
您已经使用Results
中使用的position
获取了正确的NewsHolder
对象。因此,无需进行任何修改。
Results results = mResults.get(position);
holder.bind(results);