单个 Activity 上的 Android 多个 ListView 不显示项目

标签 android android-layout android-listview android-adapter

我有一个包含 2 个 ListView 的 Activity - PairedListView 和 NewDevicesListView 以及一个扫描按钮。最初,onCreate() Activity 应显示所有蓝牙配对设备和扫描按钮。按扫描按钮时,它应该显示带有新设备的第二个 ListView 。为此,我使用了多个线性布局。但是,我的问题是两个列表都没有显示任何项目。

这是布局-

    <devicelist.layout>
                <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical"
                tools:context=".DeviceList"
                tools:ignore="ExtraText" >

              <LinearLayout 
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1" >

                 <TextView android:id="@+id/title_paired_devices"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/title_paired_devices"
                    android:visibility="gone"
                    android:background="#666"
                    android:textColor="#fff"
                    android:paddingLeft="5dp"

                />
                <ListView android:id="@+id/paired_devices"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:stackFromBottom="true"


                />
            </LinearLayout>

            <LinearLayout android:layout_weight="1"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                <TextView android:id="@+id/title_new_devices"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/title_other_devices"
                    android:visibility="gone"
                    android:background="#666"
                    android:textColor="#fff"
                    android:paddingLeft="5dp"
                />
                <ListView android:id="@+id/new_devices"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:stackFromBottom="true"

                />
                </LinearLayout>

                <Button android:id="@+id/button_scan"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/button_scan"

                />


            </LinearLayout>

这是java类

<devicelist.java>
                package org.example.spark;

            import java.util.Set;

            import android.app.Activity;
            import android.bluetooth.BluetoothAdapter;
            import android.bluetooth.BluetoothDevice;
            import android.content.BroadcastReceiver;
            import android.content.Context;
            import android.content.Intent;
            import android.content.IntentFilter;
            import android.os.Bundle;
            import android.view.Menu;
            import android.view.View;
            import android.view.View.OnClickListener;
            import android.view.Window;
            import android.widget.AdapterView;
            import android.widget.AdapterView.OnItemClickListener;
            import android.widget.ArrayAdapter;
            import android.widget.Button;
            import android.widget.ListView;
            import android.widget.TextView;


            public class DeviceList extends Activity {
                   // Return Intent extra
                public static String EXTRA_DEVICE_ADDRESS = "device_address";

                // Member fields
                private BluetoothAdapter mBtAdapter;
               private ArrayAdapter<String> mPairedDevicesArrayAdapter;
                private ArrayAdapter<String> mNewDevicesArrayAdapter;
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);

                     // Setup the window
                    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
                    setContentView(R.layout.activity_devicelist);

                    // Set result CANCELED incase the user backs out
                    setResult(Activity.RESULT_CANCELED);


                    // Initialize the button to perform device discovery
                   Button scanButton = (Button) findViewById(R.id.button_scan);
                   scanButton.setOnClickListener(new OnClickListener() {
                        public void onClick(View v) {
                            doDiscovery();
                      v.setVisibility(View.GONE);
                     }
                  });

                    // Initialize array adapters. One for already paired devices and
                    // one for newly discovered devices
               mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
                mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);

                    // Find and set up the ListView for paired devices
                   ListView pairedListView = (ListView) findViewById(R.id.paired_devices);
                  pairedListView.setAdapter(mPairedDevicesArrayAdapter);
                pairedListView.setOnItemClickListener(mDeviceClickListener);

                    // Find and set up the ListView for newly discovered devices
               ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);
                newDevicesListView.setAdapter(mNewDevicesArrayAdapter);
              newDevicesListView.setOnItemClickListener(mDeviceClickListener);

                    // Register for broadcasts when a device is discovered
                    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                    this.registerReceiver(mReceiver, filter);

                    // Register for broadcasts when discovery has finished
                    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
                    this.registerReceiver(mReceiver, filter);

                    // Get the local Bluetooth adapter
                    mBtAdapter = BluetoothAdapter.getDefaultAdapter();

                    // Get a set of currently paired devices
                    Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();

                    // If there are paired devices, add each one to the ArrayAdapter
                 if (pairedDevices.size() > 0) {
                     findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
                  for (BluetoothDevice device : pairedDevices) {
                mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());
             } }
                 else {
               String noDevices = getResources().getText(R.string.none_paired).toString();
                   mPairedDevicesArrayAdapter.add(noDevices);
                 }
                }

                @Override
                protected void onDestroy() {
                    super.onDestroy();

                    // Make sure we're not doing discovery anymore
                    if (mBtAdapter != null) {
                        mBtAdapter.cancelDiscovery();
                    }

                    // Unregister broadcast listeners
                    this.unregisterReceiver(mReceiver);
                }

                /**
                 * Start device discover with the BluetoothAdapter
                 */
                private void doDiscovery() 
                {


                    // Indicate scanning in the title
                    setProgressBarIndeterminateVisibility(true);
                    setTitle(R.string.scanning);

                    // Turn on sub-title for new devices
                   findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);

                    // If we're already discovering, stop it
                    if (mBtAdapter.isDiscovering())
                    {
                        mBtAdapter.cancelDiscovery();
                    }

                    // Request discover from BluetoothAdapter
                    mBtAdapter.startDiscovery();
                }

                // The on-click listener for all devices in the ListViews
                private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
                        // Cancel discovery because it's costly and we're about to connect
                        mBtAdapter.cancelDiscovery();

                        // Get the device MAC address, which is the last 17 chars in the View
                        String info = ((TextView) v).getText().toString();
                        String address = info.substring(info.length() - 17);

                        // Create the result Intent and include the MAC address
                        Intent intent = new Intent();
                        intent.putExtra(EXTRA_DEVICE_ADDRESS, address);

                        // Set result and finish this Activity
                        setResult(Activity.RESULT_OK, intent);
                        finish();
                    }
                };

                // The BroadcastReceiver that listens for discovered devices and
                // changes the title when discovery is finished
                private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        String action = intent.getAction();

                        // When discovery finds a device
                        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                            // Get the BluetoothDevice object from the Intent
                        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                          //   If it's already paired, skip it, because it's been listed already
                if(device.getBondState()!= BluetoothDevice.BOND_BONDED)
                    mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());

                        // When discovery is finished, change the Activity title
                } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                  setProgressBarIndeterminateVisibility(false);
                  setTitle(R.string.select_device);
                            if (mNewDevicesArrayAdapter.getCount() == 0) {
                  String noDevices = getResources().getText(R.string.none_found).toString();
               mNewDevicesArrayAdapter.add(noDevices);
                            }
                        }
                 }
                };





                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    // Inflate the menu; this adds items to the action bar if it is present.
                    getMenuInflater().inflate(R.menu.activity_devicelist, menu);
                    return true;
                }

            }

任何人都可以告诉我我可能哪里出错了吗?

编辑

嘿,我为两个适配器修改了如下代码。这是正确的方法吗?修改后试运行还是没有显示任何项目..

                        // Get a set of currently paired devices
                    Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();

                    // If there are paired devices, add each one to the ArrayAdapter
                 if (pairedDevices.size() > 0) {
                     findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
                  for (BluetoothDevice device : pairedDevices) {
                mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                mPairedDevicesArrayAdapter.notifyDataSetChanged(); }

最佳答案

您应该执行类似于以下代码的操作。

http://developer.android.com/reference/android/widget/ArrayAdapter.html .查看 .documentation 以获取更多信息

 public class YourActivity extends Activity 
 {
private ListView lv;
public void onCreate(Bundle saveInstanceState) {
      setContentView(R.layout.your_layout);
     lv = (ListView) findViewById(R.id.your_list_view_id);
    // populate arraylist with string data
     ArrayList<String> your_array_list = new ArrayList<String>();
     your_array_list.add("foo");
     your_array_list.add("bar");

     // This is the array adapter, it takes the context of the activity as a first // parameter, the type of list view as a second parameter and your array as a third parameter
     ArrayAdapter<String> arrayAdapter =      
     new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, your_array_list);
     lv.setAdapter(arrayAdapter); 
}
}

编辑

您可以在扫描设备时将数据添加到数组列表中。

notifyDataSetChanged() 通知附加的观察者底层数据已更改,任何反射(reflect)数据集的 View 都应自行刷新。

获取新数据后,您可以通过调用适配器上的 notifyDataSetChanged() 来更新 ListView 。

关于单个 Activity 上的 Android 多个 ListView 不显示项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458490/

相关文章:

android - 如何用动画更新ListView的单行?

android - 滑动标签和 fragment 行为

java - onresume 后 ViewPager 中的 fragment 为空

三星 Galaxy S4 联系人列表的 Java 边栏代码

Android Bottom Sheet Modal(对话框)没有完全打开

android - Android 布局 Activity 中的光标启动问题

android - Android中如何避免图片拉伸(stretch)

Android : ZXingScannerView by - me. dm7.barcodescanner :zxing:1. 9 不扫描二维码

java - Android 下拉旋转设计

Android:从 ListView 访问 subview