在不使用Recyclerview中的getAdapterPosition的情况下,如何在ViewHolder中获得正确的商品位置?

时间:2018-08-19 08:52:40

标签: android android-recyclerview

起初,我在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()是否有可能获得正确的物品位置?

1 个答案:

答案 0 :(得分:0)

您已经使用Results中使用的position获取了正确的NewsHolder对象。因此,无需进行任何修改。

Results results = mResults.get(position);
holder.bind(results);