2017-10-08 3 views
-1

Je suis en train de construire une application qui scanne les appareils Bluetooth et les affiche dans un recyclerview. J'écris une partie de l'application en utilisant Java et une partie de l'application dans Kotlin. pour une raison quelconque, mes articles de recyclage ne sont pas visibles. quelqu'un s'il vous plaît aidez-moi à trouver quelle erreur je fais. Je poste le code pour mon activité et aussi mon point de vue recycleur. Pour clarifier ma question. La découverte réussit, les périphériques sont trouvés et toutes les méthodes héritées dans mon adaptateur semblent être appelées. J'ai placé des messages de log dans eux et je ne vois toujours rien dans le recyclerview. Pourquoi rien n'apparaît? voici mon activité écrite en java:android java/kotlin recyclerview articles non visibles

public class ToofActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener { 

private static final String TAG = "ToofActivity"; 
private static final int REQUEST_COARSE_LOCATION = 222; 

private static BluetoothAdapter btAdapter; 

private TextView mStatusLabel; 
private Switch mStatusSwitch; 
private ProgressBar mProgressBar; 
private RecyclerView mDeviceRecylcer; 
private static ArrayList<BluetoothDevice> mDevices = new ArrayList<>(); 
private DeviceAdapter mAdapter; 

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

    checkLocationPermission(); 

    btAdapter = BluetoothAdapter.getDefaultAdapter(); 

    mStatusLabel = (TextView) findViewById(R.id.status_view); 
    mStatusLabel.setText(btAdapter.isEnabled() ? "Active" : "Inactive"); 
    mStatusSwitch = (Switch) findViewById(R.id.status_switch); 
    mStatusSwitch.setChecked(btAdapter.isEnabled()); 
    mStatusSwitch.setOnCheckedChangeListener(this); 
    mProgressBar = (ProgressBar) findViewById(R.id.search_progress_bar); 
    mDeviceRecylcer = (RecyclerView) findViewById(R.id.device_recycler); 

    mDeviceRecylcer.setLayoutManager(new LinearLayoutManager(this)); 
    mAdapter = new DeviceAdapter(getApplicationContext()); 
    mDeviceRecylcer.setAdapter(mAdapter); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options_menu, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.searchOption: 
      DiscoveryTask discovery = new DiscoveryTask(btAdapter, this, mProgressBar); 
      discovery.setOnCompleteListener(new DiscoveryTask.OnCompletedListener() { 
       @Override 
       public void onComplete() { 
        mAdapter.updateItems(mDevices); 
       } 
      }); 
      discovery.execute((Void) null); 
      break; 
    } 

    return true; 
} 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if (isChecked) { 
     btAdapter.enable(); 
     mStatusLabel.setText("Active"); 
    } else { 
     btAdapter.disable(); 
     mStatusLabel.setText("Inactive"); 
    } 
} 

public static void setDeviceList(ArrayList<BluetoothDevice> deviceList) { 
    mDevices.clear(); 
    mDevices = deviceList; 
} 

protected void checkLocationPermission() { 
    if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
       REQUEST_COARSE_LOCATION); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_COARSE_LOCATION: { 
      if (grantResults.length <= 0 
        || grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       checkLocationPermission(); 
       break; 
      } 
     } 
    } 
} 
} 

et voici le code pour mon recyclerview écrit en Kotlin:

class DeviceAdapter(val mContext : Context) : RecyclerView.Adapter<DeviceAdapter.DeviceHolder>(){ 

val mDevices = ArrayList<BluetoothDevice>() 

fun updateItems(list: ArrayList<BluetoothDevice>){ 
    mDevices.clear() 
    mDevices.addAll(list) 
    Log.d(TAG, "updating items : $mDevices") 
    notifyDataSetChanged() 
} 

override fun onBindViewHolder(holder: DeviceHolder, position: Int) { 
    Log.d(TAG, "onBindViewHolder called!") 
    holder.bindItems(mDevices.get(position)) 
} 

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): DeviceHolder{ 
    Log.d(TAG, "onCreateViewHolder called!") 
    val v = LayoutInflater.from(mContext).inflate(R.layout.device_item, parent, false) 
    return DeviceHolder(v) 
} 

override fun getItemCount(): Int { 
    return mDevices.size 
} 

inner class DeviceHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ 

     val nameView = itemView.findViewById(R.id.nameView) as TextView 
     val addrView = itemView.findViewById(R.id.addressView) as TextView 

    fun bindItems(btDevice: BluetoothDevice){ 
     Log.d(TAG, "holder created!") 
     nameView.text = btDevice.name 
     addrView.text = btDevice.address 
    } 
} 

companion object { 
    val TAG = "DeviceAdapter" 
} 

} 

vous remercie de me aider.

Répondre

0

Le problème ici était le contexte que j'utilisais. mon contexte était celui retourné de getApplicationContext() qui était incorrect. maintenant je l'ai changé en utilisant simplement this. Une fois cette modification effectuée, tous les éléments du viewholder étaient visibles.