【问题标题】:How to display detected beacons in recycler view based on distance using ALT beacon如何使用 ALT 信标根据距离在回收站视图中显示检测到的信标
【发布时间】:2018-12-06 13:40:22
【问题描述】:

嗨,我正在使用 ALT 信标库开发一个 android 应用程序。我需要根据距离在回收站视图中显示检测到的信标。附近的距离信标需要首先显示在列表中。我已经完成了一切但我得到了空白页。信标未显示在 recyclerview 中。请帮助我。

ArrayList<Beacon> data;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    recyclerView = findViewById(R.id.Recyclerview_tab);
    bt_stop =  findViewById(R.id.bt_stop);
    bt_start =  findViewById(R.id.bt_start);

    beaconManager = BeaconManager.getInstanceForApplication(this);

    beaconManager.getBeaconParsers().add(new BeaconParser()
            .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));

    beaconManager.setBackgroundBetweenScanPeriod(30000l);
    beaconManager.setForegroundBetweenScanPeriod(10000l);
    region = new Region("myMonitoringUniqueId", null, null, null);

适配器=新信标适配器(此); recyclerView.setAdapter(适配器);

    bt_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            beaconManager.bind(Main2Activity.this);
            Toast.makeText(Main2Activity.this, "clicked", Toast.LENGTH_SHORT).show();

        }
    });
    bt_stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            beaconManager.unbind(Main2Activity.this);

        }
    });
}

@Override
public void onBeaconServiceConnect() {

    final Region region = new Region("myBeaons", Identifier.parse("e2c56db5-dffb-48d2-b060-d0f5a71096e0"), null, null);

    beaconManager.addMonitorNotifier(new MonitorNotifier() {
                                         @Override
                                         public void didEnterRegion(Region region) {
                                             try {
                                                 Log.d(TAG, "didEnterRegion");
                                                 beaconManager.startRangingBeaconsInRegion(region);
                                             } catch (RemoteException e) {
                                                 e.printStackTrace();
                                             }
                                         }

                                         @Override
                                         public void didExitRegion(Region region) {
                                             try {
                                                 Log.d(TAG, "didExitRegion");
                                                 beaconManager.stopRangingBeaconsInRegion(region);
                                             } catch (RemoteException e) {
                                                 e.printStackTrace();
                                             }
                                         }

                                         @Override
                                         public void didDetermineStateForRegion(int i, Region region) {

                                         }
                                     });

        beaconManager.addRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {

adapter.initAll(信标);

Log.i(TAG, "我看到的第一个信标大约在 "+beacons.iterator().next().getDistance()+" 米外。"); } 适配器.notifyDataSetChanged();

            }
        });

        try {
            beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        } catch (RemoteException e) {    }


}

我的适配器代码:

public class Beaconadapter extends RecyclerView.Adapter<Beaconadapter.Myviewholder> {
Context mcontext;

public static  ArrayList<Beacon> beacons;

private LayoutInflater inflater;


public Beaconadapter(Context mcontext) {
    this.mcontext = mcontext;
    this.beacons = new ArrayList<Beacon>();
    this.inflater = LayoutInflater.from(mcontext);


}

@NonNull
@Override
public Myviewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v= LayoutInflater.from(mcontext).inflate(R.layout.beaconrecyclerview,viewGroup,false);
    Myviewholder myviewholder=new Myviewholder(v);
    return myviewholder;    }

@Override
public void onBindViewHolder(@NonNull Myviewholder myviewholder, int i) {
    myviewholder.tv_uuid.setText(beacons.get(i).getServiceUuid());
    myviewholder.tv_macid2.setText(beacons.get(i).getBluetoothAddress());
    myviewholder.tv_rssi2.setText((int) beacons.get(i).getDistance());

}

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

public void initAll(Collection newBeacons) {

    this.beacons.clear();
    this.beacons.addAll(newBeacons);


}

公共静态类 Myviewholder 扩展 RecyclerView.ViewHolder{ TextView tv_uuid,tv_macid2,tv_rssi2;

    public Myviewholder(@NonNull View itemView) {
        super(itemView);

        this.tv_uuid=itemView.findViewById(R.id.tv_uuid);
        this.tv_macid2=itemView.findViewById(R.id.tv_macid2);
        this.tv_rssi2=itemView.findViewById(R.id.tv_rssi2);


    }
}

}

【问题讨论】:

    标签: android android-recyclerview altbeacon


    【解决方案1】:

    一些提示:

    1. 将开始范围的代码移动到didDetermineStateForRegion。如果您在开始监控时已经在“区域内”,您将不会收到对didEnterRegion 的新回调。您总是会收到对 didDetermineStateForRegion 的回调。

    2. 在每个回调方法的顶部添加调试行。然后运行您的代码以确定调用了哪些方法:onBeaconServiceConnecteddidEnterRegiondidDetermineStateForRegiondidRangeBeaconsInRegion 被调用。

    3. 如果事件链中的一个方法没有被调用,请尝试找出原因。每次你得到一个回调工作,重复上面的步骤 2。这是调试程序的行之有效的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多