如何在这段代码中实现OnItemClickListener?

我想在这个ListView中实现OnItemClickListener,但是当我为此添加代码时,即使没有错误,我的应用也无法工作。 单击Listview项时,它会自动关闭。 请帮帮我,我是Android的初学者。 我在这里添加我的整个代码。 我正在做一个蓝牙设备连接代码。

MainActivity.java

import java.util.ArrayList; import java.util.Set; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.app.Activity; import android.app.ProgressDialog; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; public class MainActivity extends Activity { private TextView mStatusTv; private Button mActivateBtn; private Button mPairedBtn; private Button mScanBtn; private Button ledBtn; private ProgressDialog mProgressDlg; private ArrayList mDeviceList = new ArrayList(); private BluetoothAdapter mBluetoothAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mStatusTv = (TextView) findViewById(R.id.tv_status); mActivateBtn = (Button) findViewById(R.id.btn_enable); mPairedBtn = (Button) findViewById(R.id.btn_view_paired); mScanBtn = (Button) findViewById(R.id.btn_scan); ledBtn = (Button) findViewById(R.id.led); ledBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent i=new Intent(getApplicationContext(),Ledbuttons.class); startActivity(i); } }); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mProgressDlg = new ProgressDialog(this); mProgressDlg.setMessage("Scanning..."); mProgressDlg.setCancelable(false); mProgressDlg.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); mBluetoothAdapter.cancelDiscovery(); } }); if (mBluetoothAdapter == null) { showUnsupported(); } else { mPairedBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Set pairedDevices = mBluetoothAdapter.getBondedDevices(); if (pairedDevices == null || pairedDevices.size() == 0) { showToast("No Paired Devices Found"); } else { ArrayList list = new ArrayList(); list.addAll(pairedDevices); Intent intent = new Intent(MainActivity.this, DeviceListActivity.class); intent.putParcelableArrayListExtra("device.list", list); startActivity(intent); } } }); mScanBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { mBluetoothAdapter.startDiscovery(); } }); mActivateBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mBluetoothAdapter.isEnabled()) { mBluetoothAdapter.disable(); showDisabled(); } else { Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 1000); } } }); if (mBluetoothAdapter.isEnabled()) { showEnabled(); } else { showDisabled(); } } IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mReceiver, filter); } @Override public void onPause() { if (mBluetoothAdapter != null) { if (mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.cancelDiscovery(); } } super.onPause(); } @Override public void onDestroy() { unregisterReceiver(mReceiver); super.onDestroy(); } private void showEnabled() { mStatusTv.setText("Bluetooth is On"); mStatusTv.setTextColor(Color.BLUE); mActivateBtn.setText("Disable"); mActivateBtn.setEnabled(true); mPairedBtn.setEnabled(true); mScanBtn.setEnabled(true); ledBtn.setEnabled(true); } private void showDisabled() { mStatusTv.setText("Bluetooth is Off"); mStatusTv.setTextColor(Color.RED); mActivateBtn.setText("Enable"); mActivateBtn.setEnabled(true); mPairedBtn.setEnabled(false); mScanBtn.setEnabled(false); ledBtn.setEnabled(false); } private void showUnsupported() { mStatusTv.setText("Bluetooth is unsupported by this device"); mActivateBtn.setText("Enable"); mActivateBtn.setEnabled(false); mPairedBtn.setEnabled(false); mScanBtn.setEnabled(false); } private void showToast(String message) { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); if (state == BluetoothAdapter.STATE_ON) { showToast("Enabled"); showEnabled(); } } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { mDeviceList = new ArrayList(); mProgressDlg.show(); } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { mProgressDlg.dismiss(); Intent newIntent = new Intent(MainActivity.this, DeviceListActivity.class); newIntent.putParcelableArrayListExtra("device.list", mDeviceList); startActivity(newIntent); } else if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); mDeviceList.add(device); showToast("Found device " + device.getName()); } } }; 

DeviceListActivity.java

  import java.lang.reflect.Method; import java.util.ArrayList; import android.app.Activity; import android.bluetooth.BluetoothDevice; import android.os.Bundle; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.view.View; import android.widget.ListView; import android.widget.Toast; public class DeviceListActivity extends Activity { private ListView mListView; private DeviceListAdapter mAdapter; private ArrayList mDeviceList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDeviceList = getIntent().getExtras().getParcelableArrayList("device.list"); mListView = (ListView) findViewById(R.id.lv_paired); mAdapter = new DeviceListAdapter(this); mAdapter.setData(mDeviceList); mAdapter.setListener(new DeviceListAdapter.OnPairButtonClickListener() { @Override public void onPairButtonClick(int position) { BluetoothDevice device = mDeviceList.get(position); if (device.getBondState() == BluetoothDevice.BOND_BONDED) { unpairDevice(device); } else { showToast("Pairing..."); pairDevice(device); } } }); mListView.setAdapter(mAdapter); registerReceiver(mPairReceiver, new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED)); } @Override public void onDestroy() { unregisterReceiver(mPairReceiver); super.onDestroy(); } private void showToast(String message) { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); } private void pairDevice(BluetoothDevice device) { try { Method method = device.getClass().getMethod("createBond", (Class[]) null); method.invoke(device, (Object[]) null); } catch (Exception e) { e.printStackTrace(); } } private void unpairDevice(BluetoothDevice device) { try { Method method = device.getClass().getMethod("removeBond", (Class[]) null); method.invoke(device, (Object[]) null); } catch (Exception e) { e.printStackTrace(); } } private final BroadcastReceiver mPairReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR); if (state == BluetoothDevice.BOND_BONDED && prevState == BluetoothDevice.BOND_BONDING) { showToast("Paired"); } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDED){ showToast("Unpaired"); } mAdapter.notifyDataSetChanged(); } } }; } 

DeviceListAdapter.java

  import java.util.List; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.TextView; public class DeviceListAdapter extends BaseAdapter{ private LayoutInflater mInflater; private List mData; private OnPairButtonClickListener mListener; public DeviceListAdapter(Context context) { mInflater = LayoutInflater.from(context); } public void setData(List data) { mData = data; } public void setListener(OnPairButtonClickListener listener) { mListener = listener; } public int getCount() { return (mData == null) ? 0 : mData.size(); } public Object getItem(int position) { return null; } public long getItemId(int position) { return position; } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_device, null); holder = new ViewHolder(); holder.nameTv = (TextView) convertView.findViewById(R.id.tv_name); holder.addressTv = (TextView) convertView.findViewById(R.id.tv_address); holder.pairBtn = (Button) convertView.findViewById(R.id.btn_pair); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } BluetoothDevice device = mData.get(position); holder.nameTv.setText(device.getName()); holder.addressTv.setText(device.getAddress()); holder.pairBtn.setText((device.getBondState() == BluetoothDevice.BOND_BONDED) ? "Unpair" : "Pair"); holder.pairBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { mListener.onPairButtonClick(position); } } }); return convertView; } static class ViewHolder { TextView nameTv; TextView addressTv; TextView pairBtn; } public interface OnPairButtonClickListener { public abstract void onPairButtonClick(int position); } } 

activity_main.xml中

    

list_item_device.xml

    

我没有解决的问题是

  1. 当我将onItemclicklistener添加到列表视图时,该应用程序无法正常工作。

  2. 蓝牙搜索结果填充相同的设备名称。

  3. 查看配对设备和扫描设备后,我无法访问按钮(似乎相同的布局弹出到屏幕)。

    有人请帮我解决这些问题。

提前致谢。

你可以这样做 –

 mListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), " ITEM CLICKED POSITION = "+String.valueOf(position), Toast.LENGTH_SHORT).show(); } }); 

您可以像这样添加OnItemClickListener

  mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { { Toast.makeText(getApplicationContext(),String.valueOf(arg2), Toast.LENGTH_LONG).show(); } });` 

查看此代码,它包含如何设置列表视图侦听器,检测单击的行并获取该行中的子视图

 ListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // TODO Auto-generated method stub View row= adapter.getView(position, view, parent); CheckBox box=(CheckBox) row.findViewById(R.id.checkBox1); box.performClick(); } }); 

适配器是列表视图适配器
希望它有所帮助