如何在此代码中实现OnItemClickListener?

时间:2015-05-23 08:46:02

标签: java android bluetooth

我想在这个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<BluetoothDevice> mDeviceList = new ArrayList<BluetoothDevice>();

        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<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

                        if (pairedDevices == null || pairedDevices.size() == 0) { 
                            showToast("No Paired Devices Found");
                        } else {
                            ArrayList<BluetoothDevice> list = new ArrayList<BluetoothDevice>();

                            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<BluetoothDevice>();

                    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<BluetoothDevice> 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<BluetoothDevice> mData;
        private OnPairButtonClickListener mListener;

        public DeviceListAdapter(Context context) { 
            mInflater = LayoutInflater.from(context);        
        }

        public void setData(List<BluetoothDevice> 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中

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#060606"
        android:orientation="vertical"
        android:padding="@dimen/activity_vertical_margin" >

        <TextView
            android:id="@+id/tv_status"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/text_bluetooth_off"
            android:textColor="#ff0000"
            android:textSize="17sp" />

        <Button
            android:id="@+id/btn_enable"
            android:layout_width="match_parent"
            android:layout_height="33dp"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:background="#585858"
            android:text="@string/text_enable" />

        <Button
            android:id="@+id/btn_view_paired"
            android:layout_width="match_parent"
            android:layout_height="33dp"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:background="#585858"
            android:enabled="false"
            android:text="@string/text_view_paired"
            android:textColor="#FFFFFF" />

        <Button
            android:id="@+id/btn_scan"
            android:layout_width="match_parent"
            android:layout_height="33dp"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:background="#585858"
            android:enabled="false"
            android:text="@string/text_scan_devices"
            android:textColor="#FFFFFF" />

        <Button
            android:id="@+id/led"
            android:layout_width="match_parent"
            android:layout_height="33dp"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:background="#585858"
            android:enabled="false"
            android:text="LEDS"
            android:textColor="#FFFFFF" />

        <TextView
            android:id="@+id/TextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="List Of Devices"
            android:textColor="#ff0000"
            android:textSize="15sp" />

        <ScrollView
            android:id="@+id/scrollView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ScrollView>

        <ListView
            android:id="@+id/lv_paired"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>

    </LinearLayout>

list_item_device.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" 
        android:paddingTop="5dp"
        android:paddingBottom="5dp">

        <Button
            android:id="@+id/btn_pair"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:text="Pair"
            android:textColor="#ff4444" />

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignTop="@+id/btn_pair"
            android:layout_toLeftOf="@+id/btn_pair"
            android:text="Galaxy Nexus"
            android:textColor="#99cc00"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/btn_pair"
            android:layout_alignParentLeft="true"
            android:layout_toLeftOf="@+id/btn_pair"
            android:text="000000000"
            android:textColor="#ffbd21" />

    </RelativeLayout>

我未解决的问题是

  1. 将onItemclicklistener添加到列表视图时,该应用无效。

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

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

    任何人都可以帮我解决这些问题。

  4. 提前致谢。

3 个答案:

答案 0 :(得分:2)

你可以这样做 -

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();   
              }
            });

答案 1 :(得分:2)

您可以像这样添加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();   
          }
        });`

答案 2 :(得分:1)

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

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();


            }

        });

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