无法访问视图以更改背景颜色

时间:2018-08-08 02:42:59

标签: java android view

我正在构建一个简单的列表视图,该视图将吸收一系列检测到的项目并将其添加到列表中。我希望能够在单击它们时更改这些视图的颜色。但是,我正在努力创建一种访问单个视图的方法,以便可以更改其颜色。此代码基于Android Studio示例BluetoothLeGatt。我曾尝试寻找here之类的地方,但无济于事。

将检测到的设备添加到列表的类

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

OnListClick代码

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
    if (device == null) return;
    getListView().getItemAtPosition(position);
//change background color here.
}

这里我应该能够使用 getListView()。getItemAtPosition(position); 访问单个元素,但是我不知道如何使用它来更改背景颜色,因为它不提供我可以访问视图本身。

ViewList的XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView android:id="@+id/device_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"/>
    <TextView android:id="@+id/device_address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="12sp"/>
</LinearLayout>

如果有人可以提出改变Android Studio实现的方法,我将不胜感激。由于不熟悉Android开发,因此我尝试使用此代码。

2 个答案:

答案 0 :(得分:0)

您在此方法的第二秒获得了View参数

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
  v.setBackgroundColor(Color.parseColor("#ffffff"));
}

如果要更改onTouch颜色,请使用此

在您的bg.xml文件夹中创建一个drawable

<?xml version="1.0" encoding="utf-8"?> 
  <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
      <item android:state_focused="true" android:state_pressed="true" 
            android:drawable="@drawable/bgalt" /> 
      <item android:state_focused="false" android:state_pressed="true" 
            android:drawable="@drawable/bgalt" /> 
      <item android:drawable="@drawable/bgnorm" /> 
  </selector>

将此可绘制对象设置为父布局元素

<LinearLayout
    background="@drawable/bg"    
    clickable="true"
    ...>

</LinearLayout>

答案 1 :(得分:0)

您拥有的OnListClick代码(查看v) 使用此v,您可以访问与单击的视图相关的属性。