簡體   English   中英

recyclerview中沒有添加新項目?

[英]new item is not getting added in recyclerview?

我正在從藍牙掃描設備並從廣告中獲取其數據,所以其中一個設備會提供不在移動設備范圍內的其他設備的數據,因此我專門過濾了我想顯示的該設備的數據在回收者視圖中自動更新rssi值。 比方說,一個設備A連續提供3個設備B,C,D的數據,其中包含其rssi值,所以我想顯示具有不斷變化的rssi值的設備B,C,D的列表。

到目前為止,我所做的是掃描該設備“ A”,並提取B的數據並在recyclerview中顯示,但是當另一個設備(即C的數據)進入舊設備時,即B消失了,依此類推。 我想要的是不斷更改B,C,D的數據。

適配器類別:-

public class ReapeaterDeviceAdapter extends RecyclerView.Adapter<ReapeaterDeviceAdapter.CryptoViewHolder> {

    private ArrayList<RepeaterModel> data = new ArrayList<>();;
    private Context mCtx;

    public class CryptoViewHolder extends RecyclerView.ViewHolder {

        private TextView mName, mPrice;

        public CryptoViewHolder(View itemView) {
            super(itemView);
            mName = itemView.findViewById(R.id.txtName);
            mPrice = itemView.findViewById(R.id.txtPrice);
        }
    }

    public ReapeaterDeviceAdapter(Context ctx,ArrayList<RepeaterModel> data) {
        this.mCtx = ctx;
        this.data = data;
    }

    @Override
    public CryptoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.repeater_dev_data,parent, false);
        return new CryptoViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(CryptoViewHolder holder, int position) {
        System.out.println("onBinder");
        holder.mName.setText(data.get(position).macdev);
        holder.mPrice.setText(String.valueOf(data.get(position).rssi));
    }

    @Override
    public void onBindViewHolder(CryptoViewHolder holder, int position, List<Object> payloads) {

        if (payloads.isEmpty()) {
            //System.out.println("onbinder");

            super.onBindViewHolder(holder, position, payloads);
        } else {
            Bundle o = (Bundle) payloads.get(0);
            //System.out.println("in keyset");

            for (String key : o.keySet()) {
                if (key.equals("price")) {
                    holder.mName.setText(data.get(position).macdev);
                    holder.mPrice.setText(String.valueOf(data.get(position).rssi));
                    //holder.mPrice.setTextColor(Color.GREEN);
                    //this.notifyItemChanged(position);
                }
            }
        }
    }

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

    public ArrayList<RepeaterModel> getData() {
        return data;
    }

    public void setData(ArrayList<RepeaterModel> newData) {

        MyDiffUtilCallBack diffCallBack = new MyDiffUtilCallBack(newData, this.data);
        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallBack);

        //this.setData(newData);
       // this.data=newData;
        this.data.clear();
       // this.data = newData;
       this.data.addAll(newData);
        diffResult.dispatchUpdatesTo(this);

        //this.notifyItemRangeChanged(0, this.getItemCount());
        //this.notifyDataSetChanged();
        //System.out.println("Here");
    }


}

型號類別:-


    public String macdev;
    public int rssi ;
    public int imageid;

    public RepeaterModel(String macdev, int rssi, int imageid) {
        this.macdev = macdev;
        this.rssi = rssi;
        this.imageid = imageid;
    }

    public String getMacdev() {
        return macdev;
    }

    public void setMacdev(String macdev) {
        this.macdev = macdev;
    }

    public int getRssi() {
        return rssi;
    }

    public void setRssi(int rssi) {
        this.rssi = rssi;
    }

    public int getImageid() {
        return imageid;
    }

    public void setImageid(int imageid) {
        this.imageid = imageid;
    }





    @Override
    public boolean equals(Object o) {
        System.out.println("in equals");
        if (this == o) return true;
        if (!(o instanceof RepeaterModel)) return false;
        RepeaterModel that = (RepeaterModel) o;
        return getRssi() == that.getRssi() &&
                getImageid() == that.getImageid() &&
                getMacdev().equals(that.getMacdev());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getMacdev(), getRssi(), getImageid());
    }

   /*@Override
    public int hashCode() {
        int result = Integer.valueOf(rssi);
       // result = result + (imageid != 0 ? imageid.hashCode() : 0);
        result = result + rssi.hashCode();
        System.out.println("hash");
        return result;
    }*/
}

Diffutil回調:-

    ArrayList<RepeaterModel> newList;
    ArrayList<RepeaterModel> oldList;

    public MyDiffUtilCallBack(ArrayList<RepeaterModel> newList, ArrayList<RepeaterModel> oldList) {
        this.newList = newList;
        this.oldList = oldList;
    }

    @Override
    public int getOldListSize() {
        return oldList != null ? oldList.size() : 0;
    }

    @Override
    public int getNewListSize() {
        return newList != null ? newList.size() : 0;
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {

        if(newList.get(newItemPosition).getMacdev().equals(oldList.get(oldItemPosition).getMacdev()))
        {
           // Log.d("itemsame","in same");
            return true;
        }
        else {
           // Log.d("itemsame", "not same");
        }
        return false;

    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition)
    {
        //System.out.println("in content same");

        final RepeaterModel oldRepeater = oldList.get(oldItemPosition);
        final RepeaterModel newRepeater = newList.get(newItemPosition);

        if(oldRepeater.getRssi()!=(newRepeater.getRssi()))
        {
            //Log.d("item contenets","content different");
            return false;
        }
        //Log.d("item contenets","content same");
        return true;

    }

    @Nullable
    @Override
    public Object getChangePayload(int oldItemPosition, int newItemPosition) {

        RepeaterModel newModel = newList.get(newItemPosition);
        RepeaterModel oldModel = oldList.get(oldItemPosition);
        //System.out.println("getchange");

        Bundle diff = new Bundle();
        //if (newModel.getMacdev().equals(oldModel.getMacdev()))
        //{
            //System.out.println("getchange");

            if (newModel.getRssi()!=(oldModel.getRssi())) {
                diff.putInt("price", newModel.getRssi());
            }
                if (diff.size() == 0) {
                    return null;
                }


       // }
        return diff;
        //return super.getChangePayload(oldItemPosition, newItemPosition);
    }
}```



Activity Class:-

public class RepeaterAdvertise extends AppCompatActivity {
    private static BluetoothAdapter mBluetoothAdapter;
    private static BluetoothLeScanner mLEScanner;
    private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;
    private static boolean mScanning;
    private static Handler mHandler;
    private static final long SCAN_TIMEOUT = 20000;
    public DevData data;
    public Button cc;
    //List<BluetoothDevice> mBluetoothDevice;

    RecyclerView recyclerView;
    ReapeaterDeviceAdapter reapeaterDeviceAdapter;
    ArrayList<RepeaterModel> modelArrayList;// = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_repeater_advertise);

        modelArrayList = new ArrayList<>();
        recyclerView = (RecyclerView) findViewById(R.id.devdata);
        //dummyData();
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        reapeaterDeviceAdapter = new ReapeaterDeviceAdapter(RepeaterAdvertise.this, modelArrayList);

        recyclerView.setAdapter(reapeaterDeviceAdapter);


        mHandler = new Handler();
        final Intent intent = getIntent();
        data = (DevData) intent.getSerializableExtra(SINGLE_DEV_DATA);

    }

    @Override
    protected void onPause() {
        super.onPause();
       scanLeDevice(false,data.getMac_address());

    }
    @Override
    protected void onResume() {
        super.onResume();

        scanLeDevice(true,data.getMac_address());

    }

    private void scanLeDevice(final boolean enable,String mac) {
        if (enable) { // enable set to start scanning
            // Stops scanning after a pre-defined scan period.

            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if(mScanning) {
                        mScanning = false;
                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                            //noinspection deprecation
                            mBluetoothAdapter.stopLeScan(mLeScanCallback);
                        } else {
                            mLEScanner.stopScan(mScanCallback);
                        }
                        invalidateOptionsMenu();
                    }
                }
            }, SCAN_TIMEOUT);

            mScanning = true;
            UUID[] motorServiceArray = {PSoCBleRobotService.getMotorServiceUUID()};
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                //noinspection deprecation
                mBluetoothAdapter.startLeScan(motorServiceArray, mLeScanCallback);
            } else { // New BLE scanning introduced in LOLLIPOP
                ScanSettings settings;
                List<ScanFilter> filters;
                mLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
                settings = new ScanSettings.Builder()
                        .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                        .build();
                filters = new ArrayList<>();
                //ScanFilter filter = new ScanFilter.Builder().setServiceUuid(PUuid).build();
                //ScanFilter filter = new ScanFilter.Builder().setManufacturerData(89,new byte[] {}).build();
                ScanFilter filter = new ScanFilter.Builder().setDeviceAddress(mac).build();
                filters.add(filter);
                if(mLEScanner==null)
                {
                    mLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
                }
                mLEScanner.startScan(filters, settings, mScanCallback);


            }
        } else { // enable set to stop scanning
            if(mScanning) {
                mScanning = false;
                if (Build.VERSION.SDK_INT < 21) {
                    //noinspection deprecation
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                } else {
                    mLEScanner.stopScan(mScanCallback);
                }
            }
        }
        invalidateOptionsMenu();
    }
    private final BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {
            runOnUiThread(new Runnable() {
                @Override
                public void run()
                {
                    byte[] haha = scanRecord;

                   /* if(!mBluetoothDevice.contains(device))
                    {
                        //only add new devices

                        mBluetoothDevice.add(device);
                        mBleName.add(device.getName());
                        mBleArrayAdapter.notifyDataSetChanged(); // Update the list on the screen
                    }*/

                }
            });
        }
    };
    public static String SbytesToHex(SparseArray<byte[]> bytes) {
        StringBuilder builder = new StringBuilder();
        byte[] dd = bytes.valueAt(0);

        for (byte b: dd)
        {
            builder.append(String.format("%02x", b));
        }
        //System.out.println( dd.length);
        return builder.toString();

    }
    public final ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {

                ScanRecord scanRecord = result.getScanRecord();
              //  mBluetoothDevice.add(result.getDevice());
                SparseArray<byte[]> dataw = scanRecord.getManufacturerSpecificData();
            if (dataw.size() > 0) {
                //populate_devData(SbytesToHex(dataw));
                String data = SbytesToHex(dataw);
                ArrayList<RepeaterModel> repeaterModels= new ArrayList<>();
                int rssi = Integer.valueOf(data.substring(12, 14), 16) - 256;
                repeaterModels.add(new RepeaterModel(data.substring(0, 12), rssi, 1));

                insert(repeaterModels);



            } else if (false) {
                //alertDialog.dismiss();
                final Intent intent = new Intent(RepeaterAdvertise.this, ConfigurationView.class);
                intent.putExtra(EXTRAS_BLE_ADDRESS, data.getMac_address());
                intent.putExtra(EXTRAS_BLE_NAME, data.getName());
                intent.putExtra(SINGLE_DEV_DATA, data.getDev_data());
                scanLeDevice(false, data.getMac_address());
                //mconfig=false;
                startActivity(intent);
            }
        }

    };

    public void insert(ArrayList<RepeaterModel> rr)
    {
        modelArrayList.addAll(rr);
        reapeaterDeviceAdapter.setData(rr);

    }

}


在插入函數reapeaterDeviceAdapter.notifyDataSetChanged();添加此行reapeaterDeviceAdapter.notifyDataSetChanged();

public void insert(ArrayList<RepeaterModel> rr){
    modelArrayList.addAll(rr);
    reapeaterDeviceAdapter.setData(rr);
    reapeaterDeviceAdapter.notifyDataSetChanged();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM