在ViewHolder中更改TextView Array属性

时间:2018-01-27 20:39:21

标签: android arrays android-recyclerview textview

我正在尝试更改我插入到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

谢谢!

修改

Myviewholder:

     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);
        }
    }

我的Consturcutor:我有多个数据集,所以我可以将不同的数据加载到不同的texview等等。

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功能:我将数据加载到我想要的文本视图中,之后我尝试根据其负面或正面更改Textview颜色

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);
            }
        });
    }

3 个答案:

答案 0 :(得分:1)

你的循环只找到一个TextView

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

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

修改

使用您添加的新代码,我可以更好地了解您正在做的事情。但是你仍然对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

答案 1 :(得分:1)

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

由于你没有发布需要重建问题的所有代码,我不得不做一些猜测。

做这样的事情:

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(我假设)。它应该看起来像这样

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课程。

答案 2 :(得分:0)

首先使用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]);
              }