使用 AsyncTask 根据值定义文本颜色

Posted

技术标签:

【中文标题】使用 AsyncTask 根据值定义文本颜色【英文标题】:Define text color based on value using AsyncTask 【发布时间】:2021-04-30 00:07:15 【问题描述】:

所以基本上我的 AsyncTask 从 url 获取值,当我执行时,如果包含 ("-"),我想显示绿色文本或红色文本。 我四处搜索,但没有一个选项对我有用。我确实有一个 RecyclerView.ViewHolder 但在执行之前不知道如何合并。一切正常,除了颜色。 提前谢谢你

活动

public class BTCData extends AsyncTask<Void,RecyclerView.ViewHolder,Void> 
    String data = "";
    String dataParsed1h ="";
    String dataParsed24h ="";
    String dataParsed7d ="";
    String percent_change_1h = "";
    String percent_change_24h = "";
    String percent_change_7d = "";
    Activity activity;
    List<Model> items;

    public BTCData() 

    

    @Override
    protected Void doInBackground(Void... voids) 
        try 
            URL url = new URL ("https://...");
            HttpURLConnection httpURLConnection = (java.net.HttpURLConnection) url.openConnection();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line = "";
            while (line != null)
                line = bufferedReader.readLine();
                data = data+line;
            

            JSONArray JA = new JSONArray(data);
            for(int i=0 ;i< JA.length(); i++)
                JSONObject JO = (JSONObject) JA.get(i);
                percent_change_1h =  "1H  " + JO.getString("percent_change_1h") + "%";
                percent_change_24h = "24H  " + JO.getString("percent_change_24h") + "%";
                percent_change_7d = "7D  " + JO.getString("percent_change_7d") + "%" ;

                dataParsed1h = dataParsed1h + percent_change_1h;
                dataParsed24h = dataParsed24h + percent_change_7d;
                dataParsed7d = dataParsed7d + percent_change_24h;


            

         catch (MalformedURLException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
         catch (JSONException e) 
            e.printStackTrace();
        
        return null;
    

    @Override
    protected void onPostExecute(Void aVoid) 
        super.onPostExecute(aVoid);
        MainActivity.btc_percent_change_1h.setText(this.dataParsed1h);
        MainActivity.btc_percent_change_24h.setText(this.dataParsed24h);
        MainActivity.btc_percent_change_7d.setText(this.dataParsed7d);
    
```

**View Holder**
public class CoinAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

Adapter adapter;
boolean isLoading;
Activity activity;
List<Model> items;

int visibleThreshold = 5,lastVisibleItem, totalItemcount;

public void setAdapter(Adapter adapter) 
    this.adapter = adapter;


@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
    View view = LayoutInflater.from(activity)
            .inflate(R.layout.activity_main,parent,false);
    return new CoinViewHolder(view);


@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) 
    Model item = items.get(position);
    CoinViewHolder holderItem = (CoinViewHolder)holder;

    holderItem.btc_percent_change_1h.setTextColor(item.getPercentage_change_1h().contains("-")?
            Color.parseColor("#FF0000"):Color.parseColor("#32CD32"));
    holderItem.btc_percent_change_24h.setTextColor(item.getPercentage_change_24h().contains("-")?
            Color.parseColor("#FF0000"):Color.parseColor("#32CD32"));
    holderItem.btc_percent_change_7d.setTextColor(item.getPercentage_change_7d().contains("-")?
            Color.parseColor("#FF0000"):Color.parseColor("#32CD32"));



@Override
public int getItemCount() 
    return items.size();

public void setLoader() isLoading = true;
public void updateData (List<Model> models)

    this.items = models;
    notifyDataSetChanged();

**on Activity**


    public static TextView btc_percent_change_1h;
    public static TextView btc_percent_change_24h;
    public static TextView btc_percent_change_7d;



//Percentage
        btc_percent_change_1h = (TextView) findViewById(R.id.btc_percent_change_1h);
        btc_percent_change_24h = (TextView) findViewById(R.id.btc_percent_change_24h);
        btc_percent_change_7d = (TextView) findViewById(R.id.btc_percent_change_7d);


and finally call...

BTCData process = new BTCData();
        process.execute();

【问题讨论】:

请同时添加 mainactivity 代码,更具体地说,您的代码在哪里以及如何实例化适配器内容。这将有助于找出实际问题。 AsyncTaskdoInBackground 方法返回结果。然后,在onPostExecute 中获取这些返回值。将结果值从 onPostExecute 传递到所需的视图。明白了吗? @AbdulWaheed 在主要活动上我只是打电话给BTCData process = new BTCData(); process.execute(); @MuhammadAwais 你的意思是返回值给viewholder而不是返回给onPostexecute?我想到了,但不知道怎么做。 jonh :: 目前,您正在实现从doInBackground 函数返回 void。 doInBackground 应该返回您从 API 获得的结果。从doInBackground 返回的结果在onPostExecute 中接收。从onPostExecute 函数,您可以将值传递给任何其他视图。检查链接中的文档:developer.android.com/reference/android/os/AsyncTask 【参考方案1】:

这是因为在 onBindViewHolder 中设置颜色时,在这种情况下,数据仅为 0,没有红色符号,稍后您正在设置数据,但之后不会调用 onBindViewHolder,因此不会反映更改。

你做这一切的方式不是理想的方式,建议你阅读设计模式以正确的方式实现它。

【讨论】:

【参考方案2】:

也许不是最好的选择,但它确实有效

@Override
    protected void onPostExecute(CoinAdapter aVoid) 
        super.onPostExecute(aVoid);
        MainActivity.btc_percent_change_1h.setTextColor((this.dataParsed1h.contains("-")?
                Color.parseColor("#FF0000"):Color.parseColor("#32CD32")));
        MainActivity.btc_percent_change_1h.setText(this.dataParsed1h);
        MainActivity.btc_percent_change_24h.setTextColor((this.dataParsed24h.contains("-")?
                Color.parseColor("#FF0000"):Color.parseColor("#32CD32")));
        MainActivity.btc_percent_change_24h.setText(this.dataParsed24h);
        MainActivity.btc_percent_change_7d.setTextColor((this.dataParsed7d.contains("-")?
                Color.parseColor("#FF0000"):Color.parseColor("#32CD32")));
        MainActivity.btc_percent_change_7d.setText(this.dataParsed7d);
    

【讨论】:

也不需要支架和适配器。【参考方案3】:

你可以实现它。根据位置获取适配器中的值并像这样更改它的颜色。然后 cocatinate 两个字符串并显示它。您可以在多台设备上对其进行测试,它将在每台设备上运行并准确显示。

String status = getColoredSpanned(act.getResources().getString(R.string.order_status),"#3EA7BD");
               String variable_status =getColoredSpanned(act.getResources().getString(R.string.status_order_pending),"#E23941");
               String text = status+variable_status;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
                    myViewHolder.tv_order_product_status.setText(html.fromHtml(text,  Html.FROM_HTML_MODE_LEGACY), TextView.BufferType.SPANNABLE);
                 else 
                    myViewHolder.tv_order_product_status.setText(Html.fromHtml(text), TextView.BufferType.SPANNABLE);
                

【讨论】:

不起作用,因为我没有使用 listView。 ;)

以上是关于使用 AsyncTask 根据值定义文本颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式用户根据 JavaFX 中的字符串值定义列表视图的颜色

HTML - 使用 JS 根据值更改文本颜色

AsyncTask总结

根据值(字符串)更改 Plotly 表中单元格的文本颜色

HTML 和 CSS - 根据值更改单元格的文本颜色

如何根据其值更改一行中的文本颜色? [重复]