Как я могу изменить цвет указанной карты c в представлении реселлера после получения определенных данных из столбца базы данных mysql - PullRequest
0 голосов
/ 10 марта 2020

Как я могу изменить цвет указанной карты c в представлении переработчика после получения определенных данных из MySQL столбца базы данных?

Допустим, у меня есть четыре карты, представляющие разные столбцы в базе данных и при получении их состояние от MySQL для конкретной c карты, если true, станет КРАСНЫМ. Если для четырех строк в базе данных 2 строки отображают данные как true, то только две указанные c карты должны стать КРАСНЫМИ.

@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);
}

1 Ответ

1 голос
/ 10 марта 2020

Я думаю, что то, что вы хотите, может быть достигнуто с помощью метода notifyDataSetChanged();, который вы можете вызывать в любое время на вашем адаптере. вам следует написать yourAdapter.notifyDataSetChanged(); в тот момент, когда вы получите новые данные из вашей mySQL БД.

, в основном, она будет повторно выполняться onBindViewholder. тогда вам просто нужно поместить некоторые логики c в onBindViewholder, чтобы ваши предметы становились красными, когда выполняется условие для того, чтобы они стали красными

Итак, основываясь на том, что вы говорите, выполните следующие действия:

  1. всякий раз, когда данные в вашей базе данных изменяются, вам необходимо обновить данные в secDetailsList в вашем коде. Когда это происходит, вы также должны вызвать notifyDataSetChanged(); (изнутри или снаружи адаптера)

  2. в вашем методе onBindviewholder, вам необходимо оценить, является ли условие для элемента красным true:

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

таким образом, цвет будет меняться при поступлении данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...