使用 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 代码,更具体地说,您的代码在哪里以及如何实例化适配器内容。这将有助于找出实际问题。 从AsyncTask
的doInBackground
方法返回结果。然后,在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 根据值定义文本颜色的主要内容,如果未能解决你的问题,请参考以下文章