首页 > 解决方案 > 从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);
}

标签: javaandroidmysqlandroid-recyclerview

解决方案


我想你想要发生的事情可以通过notifyDataSetChanged();你可以随时在适配器上调用的方法来实现。您应该yourAdapter.notifyDataSetChanged();在从 mySQL DB 获取新数据的那一刻写下来。

它基本上会重新执行onBindViewholder。那么您只需要输入一些逻辑onBindViewholder,以便您的项目在满足变为红色的条件时变为红色

因此,根据您所说的执行以下操作:

  1. 每当数据库中的数据发生更改时,您都需要更新secDetailsList代码中的数据。发生这种情况时,您还必须调用notifyDataSetChanged();(从适配器内部或外部)

  2. 在您的 onBindviewholder 方法中,您需要评估项目为红色的条件是否为真:

    if (userDetails.getRowStatus) {holder.cards.setCardBackgroundColor(Color.RED);}

这样,只要数据到达,颜色就会改变


推荐阅读