当前位置: 首页 > 知识库问答 >
问题:

您能帮助我理解为什么我的RecolyerView没有被填充数据吗?

徐正雅
2023-03-14

在我的应用程序中,我正在扫描广告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中。

提前感谢任何指导或提示。

共有1个答案

潘泰
2023-03-14

根据这一点,我认为在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