更改 ViewHolder 中的 TextView 数组属性

Change TextView Array properties in ViewHolder

我正在尝试更改我插入到 RecyclerView 中的 Textview 数组的属性。我希望负数为红色,正数为绿色。很简单。

声明:public TextView[] mDay= new TextView[100];

初始化:

for(int i=0;i<=99;i++){
mDay[i] = (TextView) v.findViewById(R.id.day_text);
    }

在布局中显示:

Public void onBindViewHolder(MyViewHolder holder, final int position) {

 //Hier werden die ganzen Daten eingebunden
                holder.mCoin.setText(mDataset[position]);
                holder.mPrice.setText(mDataset2[position]);

               for(int i=0;i<=mDataset4.length-1;i++){
                  if(mDataset4[i].contains("-"))
                  {
                    Log.w("Negativ",mDataset4[i]);
                      holder.mDay[i].setTextColor(Color.RED);
                      holder.mDay[i].setText(mDataset4[i]);
                  }

               else {
                      Log.w("Positiv",mDataset4[i]);
                      holder.mDay[i].setTextColor(Color.GREEN);
                      holder.mDay[i].setText(mDataset4[i]);
                  }

               }

只有我数据集中的最后一个数据被插入到 RecyclerView as you can see here。

当我像其他人一样插入我的数据集时,一切都在正确的地方

 holder.mDay[position].setText(mDataset2[position]);

Obviously there is no color

谢谢!

编辑:

我的浏览器:

     public static class MyViewHolder extends RecyclerView.ViewHolder {
        public CardView mCardView;
        public TextView mCoin;
        public TextView mPrice;
        public TextView mDay;

        public MyViewHolder(View v) {
            super(v);
//Sachen aus dem Layout zuordnen
            mCardView = (CardView) v.findViewById(R.id.card_view);
            mCoin = (TextView) v.findViewById(R.id.coin_text);
            mPrice = (TextView) v.findViewById(R.id.price_text);
            mDay = (TextView) v.findViewById(R.id.day_text);
        }
    }

我的构造器:我有多个数据集,所以我可以将不同的数据加载到不同的 texviews 等等。

public MyAdapter(ArrayList <String> coin,ArrayList <String> cap,ArrayList <String> price,ArrayList <String> day) {
    mDataset = coin.toArray(new String[coin.size()]);
    mDataset2 = cap.toArray(new String[cap.size()]);
    mDataset3 = price.toArray(new String[price.size()]);
    mDataset4 = day.toArray(new String[day.size()]);
}

我的 onBindViewHolder 函数:我将我的数据加载到我想要的文本视图中,然后我尝试根据它的负数或正数来更改文本视图颜色

public void onBindViewHolder(MyViewHolder holder, final int position) {
        //Hier werden die ganzen Daten eingebunden
        holder.mCoin.setText(mDataset[position]);
        holder.mPrice.setText(mDataset2[position]);


       for(int i=0;i<=mDataset4.length-1;i++){
          if(mDataset4[i].contains("-"))
          {
              Log.w("Negativ",mDataset4[i]);
              holder.mDay.setTextColor(Color.RED);
              holder.mDay.setText(mDataset4[i]);
          }

       else {
              Log.w("Positiv",mDataset4[position]);
              holder.mDay.setTextColor(Color.GREEN);
              holder.mDay.setText(mDataset4[position]);
          }

       }


        holder.mCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String currentValue = mDataset[position];
                Log.d("CardView", "CardView Clicked: " + currentValue);
            }
        });
    }

您的循环只找到一个 TextView

mDay[i] = (TextView) v.findViewById(R.id.day_text);

每个 iR.id.day_text 必须是唯一的。


编辑

通过您添加的新代码,我对您的工作有了更好的理解。但您似乎对 onBindViewHolder() 中的这一部分感到困惑:

for (int i = 0; i <= mDataset4.length - 1; i++) {
    if (mDataset4[i].contains("-")) {
        Log.w("Negativ", mDataset4[i]);
        holder.mDay.setTextColor(Color.RED);
        holder.mDay.setText(mDataset4[i]);
    } else {
        Log.w("Positiv", mDataset4[position]);
        holder.mDay.setTextColor(Color.GREEN);
        holder.mDay.setText(mDataset4[position]);
    }
}

有几个问题:

  1. holder.mDay 仅引用一个 TextView,但您的循环试图设置四个值。所以前三个值刚好被最后一个值覆盖。

    我不确定你想在这里做什么,你想要四个不同的 TextView 来显示所有 mDataset4 吗?然后添加更多 TextView 或行或其他任何内容以按照您想要的方式显示数据。

    或者您只想显示mDataset4中的一个元素?然后简单地调用适当的值并删除整个循环。

  2. else 子句做了 4 次相同的事情。绝对没有任何变化,因为您从不引用 i.

首先使用 sam 的答案,然后执行以下操作: 您共享的代码不完整,但在了解您要执行的操作后仍然可以像这样解决您的问题: 您只能使用位置,因为它在屏幕上保存当前视图

              if(mDataset4[position]<0)
              {
                Log.w("Negativ",mDataset4[position]);
                  holder.mDay[position].setTextColor(Color.RED);
                  holder.mDay[position].setText(mDataset4[position]);
              }

           else {
                  Log.w("Positiv",mDataset4[position]);
                  holder.mDay[position].setTextColor(Color.GREEN);
                  holder.mDay[position].setText(mDataset4[position]);
              }

您不需要创建 TextView 的数组。您的 RecyclerView 已经有了您需要的 TextView。你只需要访问它。

因为你没有post所有的代码都需要重建你的问题我不得不做一些猜测。

做这样的事情:

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView mDay;
    public TextView mCoin;
    public TextView mPrice;

    public MyViewHolder(View v){
        super(v);
        // I am just guessing at the View ids. You need to substitute the right ones
        mDay = (TextView) v.findViewById(R.id.day_text);
        mCoin = (TextView) v.findViewById(R.id.coin_text);
        mPrice = (TextView) v.findViewById(R.id.price_text);
    }
}

我不明白你为什么有mDataset、mDataset2和mDataset4??您向 RecyclerView 传递了一个 ArrayList(我假设),其中 class 包含您希望显示的数据。它应该看起来像这样

private ArrayList<MyDataSet> mDataset;
public EventsRecyclerViewDataAdapter(Context context, ArrayList<MyDataSet> data){
    this.mContext = context;
    this.mDataset = data;
}


@Override
public void onBindViewHolder(final MyViewHolder holder, final int position){
    MyDataSet data = mDataset.get(position);

    holder.mCoin.setText(data.getCoin());
    holder.mPrice.setText(data.getPrice);
    String day = data.getDay();
    holder.mDay.setText(day);

    if(day.contains("-")){
        Log.w("Negativ", day);
        holder.mDay.setTextColor(Color.RED);
    }
    else {
        Log.w("Positiv", day);
        holder.mDay.setTextColor(Color.GREEN);
    }
}

现在您需要使用必要的 getter 和 setter 创建您的 MyDataSet class!