在Android中以编程方式编辑RecyclerView项目

时间:2017-01-12 10:18:14

标签: android android-recyclerview cardview

所以我有这个应用程序,我必须在其中创建一个RecyclerView,其中包含可以删除/编辑的项目列表e.t.c。

我在youtube上关注了一个教程,并在另一个布局上创建了一个自定义CardView项目,并为该项目创建了一个自定义适配器。

根据项目的状态,我必须改变一些东西(例如背景颜色或文字颜色)。

当我在RecyclerView活动中执行此操作时,即使我拥有了ID,我也会获得NullPointerException

如何在进行Retrofit调用时编辑以编程方式生成的项目列表中的TextViews

boolean isEnded;
                if(!endedAt.equals("null"))
                {
                    endedAt = endedAt.substring(endedAt.indexOf("T") + 1, endedAt.lastIndexOf(":"));
                    isEnded=true;
                }
                else
                {
                    endedAt="ongoing";
                    isEnded=false;
                }
                item.timeDifference=createdAt+" - "+endedAt;
                if(externalSystem.equals("null"))
                {
                    item.externalSystem="";
                }
                else
                {
                    item.externalSystem = externalSystem;
                }
                Log.i("attr",externalSystem);
                items.add(item);

                itemAdapter=new ItemAdapter(getApplicationContext(), items);
                recyclerView.setAdapter(itemAdapter);
                if(isEnded) {
                error->    externalSystemView.setTextColor(Color.BLACK);
                }

该应用程序相当大,但我认为您可以从这段代码中获得想法。

以下是错误:尝试在空对象引用上调用虚方法'void android.widget.TextView.setTextColor(int)'

public class ItemAdapter extends     
RecyclerView.Adapter<ItemAdapter.ItemViewHolder>{

private Context context;
private  ArrayList<Item> itemList;

public ItemAdapter(Context context, ArrayList<Item> itemList)
{
    this.context=context;
    this.itemList=itemList;
}

@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater=LayoutInflater.from(parent.getContext());
    View view=layoutInflater.inflate(R.layout.item_layout,parent,false);
    ItemViewHolder itemViewHolder=new ItemViewHolder(view);
    return itemViewHolder;
}

@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    Item item=itemList.get(position);
    holder.timeDifference.setText(item.timeDifference);
    holder.title.setText(item.title);
    holder.timeCounter.setText(item.timeCounter);
    holder.externalSystem.setText(item.externalSystem);
    holder.type.setText(item.type);
    holder.project.setText(item.project);
    MY IDEA
    "holder.timeDifference.setTextColor(Color.parseColor(item.color));"
}

@Override
public int getItemCount() {
    if(itemList!=null)
        return itemList.size();
    else
        return 0;
}


    public static class ItemViewHolder extends RecyclerView.ViewHolder
{
    public CardView cardViewItem;
    public TextView title;
    public TextView project;
    public TextView externalSystem;
    public TextView timeDifference;
    public TextView timeCounter;
    public TextView type;

    public ItemViewHolder(View itemView)
    {
        super(itemView);
        cardViewItem=(CardView)itemView.findViewById(R.id.card_view_item);
        title=(TextView)itemView.findViewById(R.id.title);
        project=(TextView)itemView.findViewById(R.id.project);
        externalSystem=
        (TextView)itemView.findViewById(R.id.external_system);
        timeDifference=   
        (TextView)itemView.findViewById(R.id.time_difference);
        timeCounter=(TextView)itemView.findViewById(R.id.time_counter);
        type=(TextView)itemView.findViewById(R.id.type);
    }

编辑:我想我找到了一种方法,但我不知道它是否是最好的

1 个答案:

答案 0 :(得分:1)

解决方案包括稍微更改Item课程。

您的问题是,您未能正确地从boolean RecyclerView.Adapter触发Activity触发器。例如。 isEndedBoolean了解项目所处状态的价值。您在使用所有三个类时都有正确的想法。

我建议您在Item类中创建一个构造函数,传递Activity中要在适配器中使用的值。我觉得使用getterssetters更容易,而不是直接从代码中分配变量。

所以,让我们开始,

 boolean isEnded;
  if(!endedAt.equals("null")) {
     endedAt = endedAt.substring(endedAt.indexOf("T") + 1, endedAt.lastIndexOf(":"));
     isEnded=true;
  } else {
     endedAt="ongoing";
     isEnded=false;
  }
    String timeDifference = createdAt+" - "+endedAt;
  if(externalSystem.equals("null")) {
    externalSystem="";
  } else {
    externalSystem = externalSystem;
  }
    Log.i("attr",externalSystem);
    items.add(new ItemModel(isEnded, timeDifference, externalSystem);

    itemAdapter=new ItemAdapter(this, items);
    recyclerView.setAdapter(itemAdapter);
    itemAdapter.notifyDataSetChanged();

您将注意到我如何为ItemModel内的每一行变量添加一个新的RecyclerView到数组中,然后将该数组传递给{{1} }。这样可以更容易地知道传递给模型的变量以及Adapter内部位置的相应行。

Adapter类的示例如下所示:

ItemModel

上述信息只是您创建更高效​​的模型框架以传递数据而非使用静态变量的指南。

现在要解决您的问题,您需要检查public class ItemModel { // Getter and Setter model for recycler view items private boolean isEnded; private String timeDifference; private String externalSystem; //other variables, title etc etc public ItemModel(boolean isEnded, String timeDifference, String externalSystem) { this.isEnded = isEnded; this.timeDifference = timeDifference; this.externalSystem = externalSystem; //only pass to the model if you can access it from code above otherwise to assign the variables statically like you have. } public boolean getIsEnded() {return isEnded;} public String getTimeDifference() {return timeDifference;} public String getExternalSystem() { return externalSystem; } } ,然后更改与if (item.getIsEnded())条件对应的文字颜色。

if RecyclerView.Adapter看起来像是:

onBindViewHolder

@Override public void onBindViewHolder(ItemViewHolder holder, int position) { ItemModel item =itemList.get(position); holder.timeDifference.setText(item.getTimeDifference()); holder.title.setText(item.title); holder.timeCounter.setText(item.timeCounter); holder.externalSystem.setText(item.getExternalSystem()); holder.type.setText(item.type); holder.project.setText(item.project); if (item.getIsEnded() { holder.timeDifference.setTextColor(item.color); } else { holder.timeDifference.setTextColor(item.color); } } 的目的是使布局膨胀,将组件绑定到该布局,并对与专用位置处的布局相对应的项执行功能。您需要知道列表中的哪个项目处于哪个州,您无法单独从Adapter执行此操作。请注意Activity在保持Adapter的代码与Activity的实际活动分开时的用处。