java - 从mysql数据库列接收某些数据后,如何在recyclerview中更改特定卡的颜色
问题描述
从 MySQL 数据库列接收某些数据后,如何在回收站视图中更改特定卡片的颜色?
假设我有四张卡片代表数据库中的不同列,并且在从 MySQL 接收特定卡片的状态时,如果 true 将变为红色。如果数据库中的四行 2 行将数据描述为真,那么只有两张特定的卡片必须变成红色。
@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View iteView = inflater.inflate(R.layout.sec_sensors, parent, false);
UserViewHolder viewHolder = new UserViewHolder(iteView);
return viewHolder;
}
@Override
public void onBindViewHolder(final UserViewHolder holder, final int position) {
final UserDetails2 userDetails = secDetailsList.get(position);
holder.tvName.setText(userDetails.getName());
holder.tvAddress.setText(userDetails.getAddress());
//Starting a new thread for continuously invoking database data.
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
UserLoginFunction(userDetails.getAddress());
// Setting color for card layout to RED but not the specific card.
holder.cards.setCardBackgroundColor(Color.RED);
}
}
}).start();
View v1 = View.inflate(context, R.layout.fragment_home, null);
lights = v1.findViewById(R.id.lights);
holder.ivMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final UserDetails2 userDetails = secDetailsList.get(position);
final int userId = userDetails.getUserId();
dbHelper = new UserDatabaseHelper2(context);
db = dbHelper.getWritableDatabase();
Context wrapper = new ContextThemeWrapper(context, R.style.myPopup);
PopupMenu menu = new PopupMenu(wrapper, holder.ivMenu);
menu.inflate(R.menu.popup_menu);
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
db.delete(UserDatabase2.TABLE_NAME2,UserDatabase2._ID + " = " + userId,null);
notifyItemRangeChanged(position,secDetailsList.size());
secDetailsList.remove(position);
notifyItemRemoved(position);
db.close();
new Security().mCount--;
break;
case R.id.update:
Intent intent = new Intent(context, UpdateActivity.class);
intent.putExtra("USERID", userId);
context.startActivity(intent);
break;
}
return false;
}
});
menu.show();
}
});
/* holder.motionoff.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
if(holder.motionoff.isChecked()) {
UserLoginFunction(userDetails.getAddress());
}
else
{
UserLoginFunction(userDetails.getAddress());
}
}
});*/
}
@Override
public int getItemCount() {
return secDetailsList.size();
}
public class UserViewHolder extends RecyclerView.ViewHolder
{
TextView tvName, tvAddress;
ImageView ivMenu;
CardView cards;
public ToggleButton motionoff;
public UserViewHolder(View itemView) {
super(itemView);
motionoff = itemView.findViewById(R.id.motion_off);
cards = itemView.findViewById(R.id.card_view);
tvName = itemView.findViewById(R.id.sec_tv1);
tvAddress = itemView.findViewById(R.id.sec_tv2);
ivMenu = itemView.findViewById(R.id.sec_iv_menu);
}
}
// This class Asynctask retrieves data from Mysql...
public void UserLoginFunction(final String email){
class UserLoginClass extends AsyncTask<String,Void,String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String httpResponseMsg) {
super.onPostExecute(httpResponseMsg);
if(httpResponseMsg.equalsIgnoreCase("1"))
{
Toast.makeText(context, httpResponseMsg,Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(context, "Not found",Toast.LENGTH_LONG).show();
}
}
@Override
protected String doInBackground(String... params) {
hashMap.put("email",params[0]);
finalResult = httpParse.postRequest(hashMap, HttpURL);
return finalResult;
}
}
UserLoginClass userLoginClass = new UserLoginClass();
userLoginClass.execute(email);
}
解决方案
我想你想要发生的事情可以通过notifyDataSetChanged();
你可以随时在适配器上调用的方法来实现。您应该yourAdapter.notifyDataSetChanged();
在从 mySQL DB 获取新数据的那一刻写下来。
它基本上会重新执行onBindViewholder
。那么您只需要输入一些逻辑onBindViewholder
,以便您的项目在满足变为红色的条件时变为红色
因此,根据您所说的执行以下操作:
每当数据库中的数据发生更改时,您都需要更新
secDetailsList
代码中的数据。发生这种情况时,您还必须调用notifyDataSetChanged();
(从适配器内部或外部)在您的 onBindviewholder 方法中,您需要评估项目为红色的条件是否为真:
if (userDetails.getRowStatus)
{holder.cards.setCardBackgroundColor(Color.RED);}
这样,只要数据到达,颜色就会改变
推荐阅读
- amazon-web-services - 如何在 AWS 或云中运行 .robot 文件来触发机器人?
- java - 寻找替代方法来创建 JSON 对象,而不是使用 Json.createObjectBuilder
- r - 在绘图下拉列表中使用绘图列表作为参数
- sql - Apache Spark Catalyst 解析器 SQL 异常
- prolog - 是否有一个函数可以检查变量是否是列表的成员而不统一它?
- sql - 如何在没有 GROUP BY 子句的情况下使用 PARTITION BY
- python - 网页抓取 ::before ::after 的内容使用 python 返回 [ ]
- azure-devops - Azure Devops 上的选项发布已消失
- flutter - 无法以健全的空值安全运行,颤振
- assembly - 在汇编中实现算术表达式