Обновите тумблер в окне реселлера, когда получатель вещания получит сообщение - PullRequest
0 голосов
/ 29 октября 2018

Я работаю над приложением, которое получает данные Bluetooth. Приложение содержит действие и несколько фрагментов, один фрагмент имеет обзорное окно с некоторыми элементами, а каждый элемент имеет кнопку переключения, текстовое представление и изображение. Я хочу установить флажок для конкретной кнопки при получении сообщения. например, если входящее сообщение содержит «1», кнопка переключения в положении 1 должна быть включена.

BluetoothConnectionSericve.java:

/**
     *Finally the ConnectedThread which is responsible for maintaining
     * the BTConnection, Sending the data,and receiving incoming data
     * through input/output streams respectively.
     */
    private class ConnectedThread extends Thread{
        private final BluetoothSocket bluetoothSocket;
        private final InputStream inputStream;
        private final OutputStream outputStream;

        public ConnectedThread(BluetoothSocket socket){
            Log.d(TAG,"ConnectedThread: Starting.");
            bluetoothSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            //Dismiss the progressDialog when connection is established
            progressDialog.dismiss();

            try {
                tmpIn = bluetoothSocket.getInputStream();
                tmpOut = bluetoothSocket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }

            inputStream = tmpIn;
            outputStream = tmpOut;
        }

        public void run(){
            byte[] buffer = new byte[1024]; //buffer store the stream
            int bytes; //bytes returned from read()

            //Keep listening to the inputStream until an exception is occurs
            while (true){
                //Read from the input stream
                try {
                    bytes = inputStream.read(buffer);
                    String inComingMessage = new String(buffer, 0, bytes);
                    Log.d(TAG,"InputStream: " + inComingMessage);

                    Intent incomingMessageIntent = new Intent("incomingMessage");
                    incomingMessageIntent.putExtra("receivedMessage", inComingMessage);
                    LocalBroadcastManager.getInstance(context).sendBroadcast(incomingMessageIntent);

                } catch (IOException e) {
                    Log.d(TAG, "write: Error listening to inputStream: " + e.getMessage());
                    break;
                }
            }
        }

Приемник вещания:

LocalBroadcastManager.getInstance(context).registerReceiver(receiver, new IntentFilter("incomingMessage"));

    BroadcastReceiver receiver = new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {

                            // new push notification is received
                            msg = intent.getStringExtra("receivedMessage");
                            if (msg.equals("1")){
                                //Set the toggle button at position 1 to true
                            }

                    }
                }

1 Ответ

0 голосов
/ 29 октября 2018

Создайте метод для установки данных в вашем классе адаптера. Я просто собираюсь использовать универсальный ArrayList класса Item для примера.

class Item{

private boolean toggleOn;

Item(boolean toggleOn){ this.toggleOn = toggleOn; }

getToggleOn(){ return toggleOn };

setToggleOn(boolean toggleOn) { this.toggleOn = toggleOn }

}

В вашем адаптере у вас должны быть объекты ArrayList of Item и метод для установки данных. Я предполагаю, что вы знаете, как использовать адаптер RecyclerView, поэтому я опускаю держатель представления.

class ItemAdapter extends RecyclerView.Adapter{

ArrayList<Item> items;

ItemAdapter(ArrayList<Item> items) { this.items = items }

@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.custom_row, parent, false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.toggleButton.setChecked(items.get(position).getToggleOn());
}

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

void toggleItemOn(int position){
items.get(position).setToggleOn(true);
notifyDataSetChanged();
}

}

Тогда в вашем BroadcastReceiver onReceive ()

BroadcastReceiver receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {

        // new push notification is received
        msg = intent.getStringExtra("receivedMessage");
        //Set the toggle button at given position to true
        //Integer.valueOf() converts a string to an Integer value
        //You may need to catch an exception if it cannot be converted
        //You will want to make sure msg does not give a higher value than your item array size.
        adapter.toggleItemOn(Integer.valueOf(msg));
    }
}
...