在我的应用程序中,我正在扫描广告BLE设备,我想在一个回收视图中显示结果。我可以很好地扫描设备,但它们没有被添加到RecyclerView中。我在主activity中创建了一个对话片段:
public static class BleConnDialogFragment extends DialogFragment {
private RecyclerView bleRecycler;
private ScanListAdapter mScanAdapter;
private void loadScanResults() {
Log.w(LOG_TAG, "results: ");
for (final BluetoothDevice device : mScanResults) {
Log.w(LOG_TAG, device.getName());
}
mScanAdapter.notifyDataSetChanged();
}
@Override
@NonNull
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.w(LOG_TAG,"bledialog onactivitycreated");
}
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.w(LOG_TAG, "ble dialog oncreatedialog");
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
View view = layoutInflater.inflate(R.layout.dialog_ble_config, null);
builder.setView(view);
Button scanForDevices = view.findViewById(R.id.btn_scan_for_devices);
mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, @NonNull ScanResult result) {
Log.w(LOG_TAG, "onScanResult: " + result.getDevice().getName() + " " + result.getDevice().getAddress());
}
@Override
public void onBatchScanResults(@NonNull List<ScanResult> results) {
Log.w(LOG_TAG, "onBatchScanResults ");
for (final ScanResult result : results) {
boolean add = true;
Log.w(LOG_TAG, "batch scan device: " + result.getDevice().getName() + " " + result.getDevice().getAddress());
for (final BluetoothDevice device : mScanResults) {
if (result.getDevice().getAddress().toString().equals(device.getAddress().toString())) {
add = false;
}
}
if (add == false || result.getDevice().getName() == null) continue;
((MainActivity)getActivity()).mScanResults.add(result.getDevice());
}
}
@Override
public void onScanFailed(int errorCode) {
Log.w(LOG_TAG, "scan failed");
}
};
bleScanTimer = new Runnable() {
@Override
public void run() {
Log.w(LOG_TAG,"blescantimer");
if (scanTimeOut) {
Log.w(LOG_TAG, "stopping scan; devices found: " + mScanResults.size());
mScanner.stopScan(mScanCallback);
mProgressDialog.dismiss();
scanTimeOut = false;
loadScanResults();
} else {
bleHandler.postDelayed(this::run, 10000);
scanTimeOut = true;
}
}
};
scanForDevices.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.w(LOG_TAG, "scanning for devices...");
mScanner = BluetoothLeScannerCompat.getScanner();
ScanSettings settings = new ScanSettings.Builder()
.setLegacy(false)
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setReportDelay(1000)
.setUseHardwareBatchingIfSupported(true)
.build();
List<ScanFilter> filters = new ArrayList<>();
filters.add(new ScanFilter.Builder().setServiceUuid(null).build());
mScanner.startScan(filters, settings, mScanCallback);
bleHandler.post(bleScanTimer);
mProgressDialog = MyUtilities.createDialog(getContext());
}
});
((MainActivity)getActivity()).bleConnDialog = builder.create();
return ((MainActivity)getActivity()).bleConnDialog;
}
@Override
@NonNull
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.w(LOG_TAG, "ble dialog oncreateview");
View view = inflater.inflate(R.layout.dialog_ble_config, container, false);
bleRecycler = view.findViewById(R.id.rv_scan_devices);
mScanAdapter = new ScanListAdapter(this.getContext(), mScanResults);
bleRecycler.setAdapter(mScanAdapter);
bleRecycler.setLayoutManager(new LinearLayoutManager(this.getContext()));
return view;
}
}
下面是包含RecyclerView的片段的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/dialog_padding"
android:paddingEnd="@dimen/dialog_padding">
<TextView
android:id="@+id/ble_config_title_tv"
style="@style/TextAppearance.AppCompat.Headline"
android:layout_width="400dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/dialog_content_margin_between"
android:gravity="center"
android:text="@string/wifi_setup_ble" />
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/rv_scan_devices"/>
<Button
android:id="@+id/btn_scan_for_devices"
style="@style/MyFlatButtonStyle"
android:layout_width="wrap_content"
android:layout_height="@dimen/button_height"
android:layout_weight="1"
android:layout_gravity="center"
android:text="@string/scan_for_devices" />
</LinearLayout>
</LinearLayout>
以下是扫描结果项的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/scan_item_tv"/>
</LinearLayout>
下面是recyclerview适配器:
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class ScanListAdapter extends RecyclerView.Adapter<ScanListAdapter.ResultViewHolder> {
private LayoutInflater mInflater;
private final ArrayList<BluetoothDevice> mScanResults;
@NonNull
@Override
public ScanListAdapter.ResultViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View mItemView = mInflater.inflate(R.layout.ble_scan_item, parent,false);
return new ResultViewHolder(mItemView, this);
}
@Override
public void onBindViewHolder(@NonNull ScanListAdapter.ResultViewHolder holder, int position) {
String mCurrent = mScanResults.get(position).getName().toString();
holder.resultItemView.setText(mCurrent);
}
@Override
public int getItemCount() {
return mScanResults.size();
}
class ResultViewHolder extends RecyclerView.ViewHolder {
public final TextView resultItemView;
final ScanListAdapter mAdapter;
public ResultViewHolder(View itemView, ScanListAdapter adapter) {
super(itemView);
resultItemView = itemView.findViewById(R.id.scan_item_tv);
this.mAdapter = adapter;
}
}
public ScanListAdapter(Context context, ArrayList<BluetoothDevice> devices) {
mInflater = LayoutInflater.from(context);
this.mScanResults = devices;
}
}
在函数loadScanResults中,我可以确认扫描的结果。在我心目中,它应该像在onCreateView中配置回收器,然后在LoadScanResults中调用notifyDataSetChanged一样简单。我的ScanListAdapter代码基本上是直接从google CodeLab改编的。我不明白为什么扫描结果没有出现在UI中。
提前感谢任何指导或提示。
根据这一点,我认为在UI中只显示一个项目,你可以滚动,然后显示另一个项目,请检查这个解决方案,请将布局高度改为包装内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/scan_item_tv"/>
</LinearLayout>
并且请确保授予并实现运行时权限。谢谢
我正在尝试将CSV文件导入MySQL数据库,但没有成功。 我的数据库中有5列: ID, userID, moviID,速率,时间戳 在我的CSV文件中,只有4列由两个冒号“::”分隔。 这是示例数据: 1::1193::5::978300760 这是我的问题 $query=“将数据填充“$uploadfile”到表评级\以“::”结尾的表字段中,行以“\n”(userID、movieID、rate
问题内容: 我有这个jQuery来响应被单击的按钮并调用REST方法: 不仅仅是不调用REST方法-此处理程序显然根本没有触发,因为我没有看到任何警报(“ 单击该按钮。 ”或“ 嘿,嘘! ”)。 该脚本 是 被添加- I可以通过它步骤,和瓦尔(如“unitval”) 被 被分配相应的值。 那么,为什么要单击这样声明的按钮: …没做什么? 这是要添加的脚本(从“视图”>“页面源”): 这可能并不相关
问题内容: 我有两个模型要参考。风格和品牌。 品牌填充了所需的对象,但样式始终为空。 我试过清除缓存/删除索引。有和没有include_in_parent并键入:’nested’。 我觉得这可能与指定的es_type等有关。不确定。 产品架构: 样式架构: 搜索查询: 当我查询时,得到以下结果: 关于评论请求: 产品已添加到数据库: 前/角: 问题答案: 我已经工作了,但是它与npm / gith
我有一个C++实验室,问题是:用户应该为X输入一个值(X是所持有的测试数)。如果x<15,程序不计算任何东西。如果X在16和30之间,程序应计算C=1.0/10.0*(24a);如果X>30,程序应计算C=0.15(24*a)。我的multiple if代码可以工作,但是当我输入X的值时,方程没有解出。有人知道吗??
我有一个码头工人。编写文件,当我启动它时,我希望它创建一个包含一些表的数据库。 我的码头工人组成: 项目结构: 实际的 SQL 文件: -- 主机:本地主机 数据库:待办事项 --服务器版本8.0.18 /*!40101 SET@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /; /! 40101 SET@OLD_CHARACTER_SET_RES
首先,我看了这里所有其他类似的帖子,但没有一个能帮上忙。我正在写一个扫雷游戏,我试图在JFrame的边界布局顶部放置一个Jlabel,并让它显示一个计数器,指示还有多少地雷需要标记。每当单击网格上的任何其他JLabel时,都需要重新绘制它。首先,对于我的代码,我的标题JLabel上从来没有显示任何文本。让文本显示的唯一方法是将其放入我的JLabel构造函数中。这让我觉得我的paintCompone