0

나는 이미 질문을했지만 성공하지 못했습니다.listview에서 수행하는 방법은 무엇입니까?

그래서 블루투스 장치 목록이 있습니다. 이 목록에는 하나의 항목 (하나의 장치) 만 있다고 가정합니다. 이 항목을 클릭하면 ListActivity의 onListItemClick() 메서드가 호출됩니다. 내가하고 싶은 것은 performclick() 함수로 클릭을 시뮬레이트하고 싶기 때문에 사용자의 클릭없이이 항목을 선택하는 것입니다.

여기 내 코드입니다 :

if(mLeDeviceListAdapter.getCount() >0) { 
    getListView().performItemClick(getListView().getAdapter().getView(0, null, null), 0, 0); 
} 

하지만 아무것도 변경되지 : onResume에서

public class DeviceScanActivity extends ListActivity { 
private LeDeviceListAdapter mLeDeviceListAdapter; 
private BluetoothAdapter mBluetoothAdapter; 
private boolean mScanning; 
private Handler mHandler; 
BluetoothCrashResolver bluetoothCrashResolver; 
//UUID[] uuids = { UUID.fromString("1811")}; 


private static final int REQUEST_ENABLE_BT = 1; 
// Stops scanning after 10 seconds. 
private static final long SCAN_PERIOD = 10000; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActionBar().setTitle(R.string.title_devices); 
    mHandler = new Handler(); 


    if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
     Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); 
     finish(); 
    } 


    final BluetoothManager bluetoothManager = 
      (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
    mBluetoothAdapter = bluetoothManager.getAdapter(); 


    if (mBluetoothAdapter == null) { 
     Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show(); 
     finish(); 
     return; 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    if (!mScanning) { 
     menu.findItem(R.id.menu_stop).setVisible(false); 
     menu.findItem(R.id.menu_scan).setVisible(true); 
     menu.findItem(R.id.menu_refresh).setActionView(null); 
    } else { 
     menu.findItem(R.id.menu_stop).setVisible(true); 
     menu.findItem(R.id.menu_scan).setVisible(false); 
     menu.findItem(R.id.menu_refresh).setActionView(
       R.layout.actionbar_indeterminate_progress); 
    } 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu_scan: 
      mLeDeviceListAdapter.clear(); 
      scanLeDevice(true); 
      break; 
     case R.id.menu_stop: 
      scanLeDevice(false); 
      break; 
    } 
    return true; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    bluetoothCrashResolver = new BluetoothCrashResolver(this.getApplicationContext()); 
    bluetoothCrashResolver.start(); 

    // Ensures Bluetooth is enabled on the device. If Bluetooth is not currently enabled, 
    // fire an intent to display a dialog asking the user to grant permission to enable it. 
    if (!mBluetoothAdapter.isEnabled()) { 
     if (!mBluetoothAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
     } 
    } 

    // Initializes list view adapter. 
    mLeDeviceListAdapter = new LeDeviceListAdapter(); 
    setListAdapter(mLeDeviceListAdapter); 
    scanLeDevice(true); 

    if(mLeDeviceListAdapter.getCount() >0) { 
     getListView().performItemClick(getListView().getAdapter().getView(0, null, null), 0, 0); 
    } 
} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // User chose not to enable Bluetooth. 
    if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) { 
     finish(); 
     return; 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    scanLeDevice(false); 
    bluetoothCrashResolver.stop(); 
    mLeDeviceListAdapter.clear(); 

} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position); 
    if (device == null) return; 
    final Intent intent = new Intent(this, DeviceControlActivity.class); 
    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, device.getName()); 
    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress()); 
    if (mScanning) { 
     mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     mScanning = false; 
    } 
    startActivity(intent); 
} 



private void scanLeDevice(final boolean enable) { 
    if (enable) { 
     // Stops scanning after a pre-defined scan period. 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mScanning = false; 
       mBluetoothAdapter.stopLeScan(mLeScanCallback); 
       invalidateOptionsMenu(); 
      } 
     }, SCAN_PERIOD); 

     mScanning = true; 
     mBluetoothAdapter.startLeScan(mLeScanCallback); 
    } else { 
     mScanning = false; 
     mBluetoothAdapter.stopLeScan(mLeScanCallback); 
    } 
    invalidateOptionsMenu(); 
} 

// Adapter for holding devices found through scanning. 
private class LeDeviceListAdapter extends BaseAdapter { 
    private ArrayList<BluetoothDevice> mLeDevices; 
    private LayoutInflater mInflator; 

    public LeDeviceListAdapter() { 
     super(); 
     mLeDevices = new ArrayList<BluetoothDevice>(); 
     mInflator = DeviceScanActivity.this.getLayoutInflater(); 
    } 

    public void addDevice(BluetoothDevice device) { 
     if(!mLeDevices.contains(device)) { 
      mLeDevices.add(device); 
     } 
    } 

    public BluetoothDevice getDevice(int position) { 
     return mLeDevices.get(position); 
    } 

    public void clear() { 
     mLeDevices.clear(); 
    } 

    @Override 
    public int getCount() { 
     return mLeDevices.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return mLeDevices.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     ViewHolder viewHolder; 
     // General ListView optimization code. 
     if (view == null) { 
      view = mInflator.inflate(R.layout.listitem_device, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); 
      viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); 
      view.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) view.getTag(); 
     } 

     BluetoothDevice device = mLeDevices.get(i); 
     final String deviceName = device.getName(); 
     if (deviceName != null && deviceName.length() > 0) 
      viewHolder.deviceName.setText(deviceName); 
     else{ 
      viewHolder.deviceName.setText(R.string.unknown_device); 
      viewHolder.deviceAddress.setText(device.getAddress()); 
     } 
     return view; 
    } 
} 

// Device scan callback. 
private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 

    @Override 
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mLeDeviceListAdapter.addDevice(device); 
       mLeDeviceListAdapter.notifyDataSetChanged(); 
       bluetoothCrashResolver.notifyScannedDevice(device, mLeScanCallback); 
      } 
     }); 
    } 
}; 

static class ViewHolder { 
    TextView deviceName; 
    TextView deviceAddress; 
} 

}

() 함수, 내가 그 라인을 추가했습니다. 항목을 클릭해도 문제가 어디서 발생하는지 알 수 없습니다. 내가 선을 연기한다면 mLeDeviceListAdapter.getCount는()> 0

응용 프로그램은 모두 convertView 및 대한 null을 전달하는 때문에 parent 당신은 본질적으로 만드는

답변

1

가 사전에 감사 충돌 새로운 parentless 뷰. 클릭하면 ListViewonClickListener으로 전화하지 않습니다.

당신은하지 어댑터의 ListView에서 직접보기를 얻어야한다 :

list.performItemClick(list.getChildAt(0), 0, list.getItemIdAtPosition(0)); 

업데이트 :

클릭 지연보십시오 :

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     list.performItemClick(list.getChildAt(0), 0, list.getItemIdAtPosition(0)); 
    } 
}, 2000); 
+0

예하지만 유일한 방법 I을 "Listview list;"와 같은 것이 없기 때문에 getListView()를 사용하여 listview에 액세스 할 수 있습니다. onResume()에서. – Bob

+0

오류가 발생하지 않으면 @Bob'getListView()'가 잘되어야합니다. 그러나 나는 ListView가 클릭을 호출 할 때 아직 준비가되어 있지 않을 수 있으므로 업데이트 된 답변 에서처럼 지연 시키십시오. – Simas

+0

Yesss, that worked !!! 마침내 !! 정말 고맙습니다 ! ;). 2 일이 지났어. 내가 찾고 있었어. 다시 한번 감사드립니다. 미안 해요 당신의 대답을 유용하게 만들 정도로 충분한 평판을 얻지 못했습니다. ( – Bob