当广播接收器收到消息时,更新 recyclerview 的切换按钮
Update the toggle button at recyclerview when the broadcast receiver gets the message
我正在开发接收蓝牙数据的应用程序。该应用程序包含一个 activity 和一些片段,一个片段有一个带有一些项目的回收视图,每个项目都有一个切换按钮、一个文本视图和一个图像视图。我想在广播接收器收到消息时设置检查特定的切换按钮。
例如,如果传入消息包含“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
}
}
}
创建一个方法来设置适配器中的数据class。我将使用 class Item 的通用 ArrayList 作为示例。
class Item{
private boolean toggleOn;
Item(boolean toggleOn){ this.toggleOn = toggleOn; }
getToggleOn(){ return toggleOn };
setToggleOn(boolean toggleOn) { this.toggleOn = toggleOn }
}
在您的适配器中,您应该有一个 Item 对象的 ArrayList 和一个设置数据的方法。我假设您知道如何使用 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));
}
}
我正在开发接收蓝牙数据的应用程序。该应用程序包含一个 activity 和一些片段,一个片段有一个带有一些项目的回收视图,每个项目都有一个切换按钮、一个文本视图和一个图像视图。我想在广播接收器收到消息时设置检查特定的切换按钮。 例如,如果传入消息包含“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
}
}
}
创建一个方法来设置适配器中的数据class。我将使用 class Item 的通用 ArrayList 作为示例。
class Item{
private boolean toggleOn;
Item(boolean toggleOn){ this.toggleOn = toggleOn; }
getToggleOn(){ return toggleOn };
setToggleOn(boolean toggleOn) { this.toggleOn = toggleOn }
}
在您的适配器中,您应该有一个 Item 对象的 ArrayList 和一个设置数据的方法。我假设您知道如何使用 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));
}
}