【问题标题】:How do I setText in ReccyclerView's onBindViewHolder?如何在 ReccyclerView 的 onBindViewHolder 中设置文本?
【发布时间】:2016-08-02 09:20:44
【问题描述】:

尝试为 RecyclerView 设置适配器。

Android Studio 中这两行返回错误信息:“Cannot resolve symbol 'todo' and 'note1'”:

holder.todo.setText(dbList.get(position).getTodo());
holder.note1.setText(dbList.get(position).getNote1());

“todo”和“note1”是通过两个EditTexts收集用户输入数据的字符串。

viewHolder 也显示错误:“局部变量 viewHolder 是多余的”。 请指教。

完整列表Adaper.java

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

List<DataModel> dbList = new ArrayList<>();
Context context;
LayoutInflater mLayoutInflater;

public ListAdapter(Context context, List<DataModel> dbList) {
    this.context =  context;
    this.dbList = dbList;
    mLayoutInflater = LayoutInflater.from(context);
}

@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View convertView = mLayoutInflater.inflate(R.layout.singlecard_layout, parent, false);
    ListViewHolder viewHolder = new ListViewHolder(convertView);
    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        holder.todo.setText(dbList.get(position).getTodo());
        holder.note1.setText(dbList.get(position).getNote1());
}

@Override
public int getItemCount() {
    return dbList.size();
}

public class ListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public ListenerEditText todo,note1;

    public ListViewHolder(View itemView) {
        super(itemView);

        todo = (ListenerEditText) itemView.findViewById(R.id.CEditText);
        note1 = (ListenerEditText) itemView.findViewById(R.id.DEditText);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
    }
  }
}

完整的 DataModel.java

public class DataModel {

private String todo;
private String note1;

public String getTodo() {
    return todo;
}

public void setTodo(String todo) {
    this.todo = todo;
}

public String getNote1() {
    return note1;
}

public void setNote1(String note1) {
    this.note1 = note1;
}    

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    您需要做的就是更改onBindViewHolder() 的定义以采用您的ListViewHolder 类型而不是通用RecyclerView.ViewHolder

    @Override
    public void onBindViewHolder(ListViewHolder holder, int position) {
    
            holder.todo.setText(dbList.get(position).getTodo());
            holder.note1.setText(dbList.get(position).getNote1());
    }
    

    或者,您可以继续使用通用 RecyclerView.ViewHolder 并将其转换为您的 ViewHolder 类型。这在一个适配器中使用不同类型的行时很常见:

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
            ListViewHolder listViewHolder = (ListViewHolder) holder;
    
            listViewHolder.todo.setText(dbList.get(position).getTodo());
            listViewHolder.note1.setText(dbList.get(position).getNote1());
    }
    

    至于“局部变量是多余的”警告,它只是希望您将其合并到一行而不是创建局部变量:

    @Override
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
        View convertView = mLayoutInflater.inflate(R.layout.abc_action_bar_title_item, parent, false);
        return new ListViewHolder(convertView);
    }
    

    尽管请注意,这实际上是一个无用的警告,但我会保持代码不变并忽略该警告。

    【讨论】:

    • 好吧,哇,我显然已经盯着屏幕太久了。使其特定于我引用字符串的 ListViewHolder !谢谢你。关于为什么 viewHolder 对象抛出“局部变量是多余的”有什么想法吗?
    • 就是这一行:“ListViewHolder viewHolder = new ListViewHolder(convertView);”
    • 在该行定义,然后在下一行“return viewHolder”,就是在文件中。
    • 我进行了清理,然后进行了重建。同样的问题。然后我更改为新的对象名称和相同的错误。同时,回答被赞成并接受。不知道接下来要尝试什么。
    • @DN 好了,我们做到了。你是一个绅士和一个学者。由于 OnBindViewHolder() 中的某些问题,应用程序仍然崩溃,所以如果我能解决这个问题,我应该很高兴。
    【解决方案2】:

    将其设为公共类 ListViewHolder

    到公共静态类 ListViewHolder

    然后 public void onBindViewHolder(RecyclerView.ViewHolder holder,

    to onBindViewHolder(ListAdapter.ViewHolder holder

    你应该使用你在 onBindViewHolder 上创建的 ViewHolder

    希望对你有所帮助

    【讨论】:

    • 好的,我试试。我是否正在更改“公共类 ListViewHolder 扩展...?”并且不更改公共 ListViewHolder onCreateViewHolder 方法?
    • 是的,将该类更改为公共静态,然后更改您的 onBindViewHolder 参数
    • 对不起,我无法发布代码。仍然不知道如何正确地做到这一点
    • ViewHolder 类应该是静态的 afaik。
    • 可以,但没那么重要……见这里:stackoverflow.com/questions/31302341/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2011-02-19
    • 2011-06-03
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多