【问题标题】:Change TextView Array properties in ViewHolder更改 ViewHolder 中的 TextView 数组属性
【发布时间】:2018-07-06 21:52:38
【问题描述】:

我正在尝试更改要插入到 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]);
                  }

               }

只有我的 Dataset 中的最后一条数据被插入到 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);
            }
        });
    }

【问题讨论】:

  • 您需要发布更多代码,以便更轻松地为您提供准确的答案。
  • 你的代码没有意义。你的RecyclerView 的一排有 100 个TextViews?
  • 不,我没有 100 个文本视图。我的 CardFragment 中只有 1 个。我尝试将其声明为数组,这样我就可以更改每个条目的颜色。检查图像,也许它们可以帮助您了解我想要实现的目标。
  • 你为什么这样做:: "public MyAdapter(ArrayList coin,ArrayList cap,ArrayList price,ArrayList day) {" ??所有这些ArrayList 对象的大小都相同吗?如果没有,那么这个 "mDataset[position]" ... "mDataset4[position]" 将不起作用!您应该使用公共 getter 和 setter(标准 Java 的东西!)填充 RecyclerView 所需的所有值创建一个类。
  • Yikes.So 我有 4 个不同的 ArrayList,我将它们交给构造函数,以便我可以使用这些数据。这似乎有效。一个 Arraylist 对应一个 mDataset。数据和所有内容都正确显示,但只是我无法更改每一行的颜色。

标签: android arrays android-recyclerview textview


【解决方案1】:

您不需要创建TextViews 的数组。您的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 类!

【讨论】:

  • 感谢您的努力。可悲的是,它似乎不起作用。如果你能看一下我的编辑,我会很高兴。干杯队友
  • 我做了一个小调整,但这也是我认为 Micheal 想要做的。
  • @Sam :: 谢谢我没有发现mDay[] 的错误(我在一个简单的文本编辑器中写我的答案,因为我没有在我的开发人员计算机上工作)。
【解决方案2】:

您的循环只找到一个 TextView

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

每个i 的R.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 吗?然后添加更多 TextViews 或行或其他任何内容以按照您想要的方式显示数据。

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

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

【讨论】:

  • 这是为什么呢?我认为使用 RecyclerView 意味着只使用一个 Textview。有解决办法吗?
  • 是的,如果您正确设置 ViewHolder,这就是它的目的。我假设你的循环在你的 ViewHolder 构造函数中,由于我上面指出的原因,它需要被修复。
  • 我不太明白如何修复它,因为我的卡片片段中只有一个 TextView。循环在 MyViewHolder 类中。如果您能进一步解释一下,我会很高兴。
  • 在每一行和你的 MyViewHolder 构造函数中发布布局代码。然后告诉我。
  • onBindViewHolder() 旨在以Barnes' answer is written. 的方式使用您应该修改您的代码以匹配它。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2020-11-03
    相关资源
    最近更新 更多