【问题标题】:Populating RecyclerView with ListArray使用 ListArray 填充 RecyclerView
【发布时间】:2017-12-27 22:45:29
【问题描述】:

我正在使用列表数组填充我的回收站视图。我已经尝试过字符串数组,因为它不适合我。我做错了还是必须使用数组适配器?

如果我必须使用阵列适配器,我该怎么做?我已经用 arrayadapter 填充了列表视图,但是因为我在海洋中间,所以我不想尝试一些大的东西。我的 recyclerview 适配器的代码如下。

它没有显示错误。但视图正在填充数组中的最后一项。

public class AudioRecycleViewAdapter extends 
RecyclerView.Adapter<RecyclerView.ViewHolder> {
private  List<String> values = Arrays.asList ("Al Feel","Al Humazah","Al 
Kausar","Al Maoon","Al Quresh","Dr Israr",
        "Al Kafiroon","An Nasr","Al Lahab","Al Ikhlaas","Al Falaq","An 
Naas","Iman Part 1",
        "Iman Part 2","Iman Part 3","Iman Part 4","Iman Part 5");

Context context;
InterstitialAd mInterstitialAd;
private int audiolayout;
public TextView txtHeader;
public TextView txtFooter;
TextView txtarabic;


public AudioRecycleViewAdapter(List<String> values, int audiolayout, Context context, InterstitialAd intAdView ) throws IOException {
    this.audiolayout = audiolayout;
    this.context = context;
    this.mInterstitialAd = intAdView;
}
public Context getContext() {
    context = this.getContext();
    return context;
}

// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public View layout;

    public ViewHolder(View v) {
        super(v);
        layout = v;
        txtHeader = (TextView) v.findViewById(R.id.audio_subtitle);
        txtFooter = (TextView) v.findViewById(R.id.audio_title);
        txtarabic = (TextView) v.findViewById(R.id.arabic_title);
    }
}

public void add(int position, String item) {
    values.add(position, item);
    notifyItemInserted(position);
}

public void remove(int position) {
    values.remove(position);
    notifyItemRemoved(position);
}
// Create new views (invoked by the layout manager)
@Override
public AudioRecycleViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    // create a new view
    LayoutInflater inflater = LayoutInflater.from(
            parent.getContext());

    View v =
            inflater.inflate(R.layout.audio_row_layout, parent, false);
    // set the view's size, margins, paddings and layout parameters
    ViewHolder vh = new ViewHolder(v);

    return vh;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    int x;
    for(position =0; position < values.size(); position++)
    {
        txtHeader.setText(values.get(position));
        position++;
    }

}

// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
    return values.size();
}

}

【问题讨论】:

  • 你能分享你的错误日志吗?
  • 未显示错误...它在每一行上填充列表中的最后一项

标签: android android-recyclerview


【解决方案1】:

首先:在 AudioRecycleViewAdapter 中使用您自定义的 ViewHolder,因此请更改此设置

extends RecyclerView.Adapter<RecyclerView.ViewHolder>

到这里

extends RecyclerView.Adapter<AudioRecycleViewAdapter.ViewHolder>

第二:你正在浏览所有元素,只是为了在 textHeader 中显示最后一个值并使用holder.txtHeader

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        holder.txtHeader.setText(values.get(position));

}

第三个:itemLayout视图的子视图,应该在ViewHolder里面所以

public class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public View layout;
    public TextView txtHeader;
    public TextView txtFooter;
    public TextView txtarabic;

    public ViewHolder(View v) {
        super(v);
        layout = v;
        txtHeader = (TextView) v.findViewById(R.id.audio_subtitle);
        txtFooter = (TextView) v.findViewById(R.id.audio_title);
        txtarabic = (TextView) v.findViewById(R.id.arabic_title);
    }
}

【讨论】:

  • 已经试过了,方法不会用超类覆盖发生错误
  • @ManzoorAhmad 是的,由于旧方法签名,所以删除旧方法并让工作室用新签名覆盖方法,然后您将看到 AudioRecycleViewAdapter.ViewHolder 作为 onBindViewHolder 中的参数
  • 好吧,让我改变它..不要去伙计,,,
  • 但我希望 Recycler.Viewholder Holde 在参数中。
  • @ManzoorAhmad 移动持有人内部的视图,尝试更新答案
【解决方案2】:

除了 Pavneet_Singh 的回答之外,您还可以在自定义 ViewHolder 中添加 bind() 方法,并在此方法中绑定与 RecyclerView 项相关的数据。当事情变得更加复杂时,我在简单的项目中使用了这种方法。它应该像这样工作:

//adapter's inner
class SomeClassViewHolder(val view: View) extends RecyclerView.ViewHolder(view) {
    //here can be view initializing, like
    txtHeader = (TextView) view.findViewById(R.id.audio_subtitle);

    void bind(int position){
        // all view binding logic goes here, for example:
        txtHeader.setText("someText");
    }
}

//and then in adapter
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        holder.bind(values.get(position));
}

编辑: 正确使用这应该可以帮助您避免查找holder 的绑定属性时出现问题,例如textView 等。此外,将来您可以操作持有者的项目侦听器bind() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多