Android中ListView数据不显示问题

一、简介:

最近使用listView来显示蓝牙设备列表,运行后发现什么都没有显示。

 

二、调试:

1、在自定义Adapter重写的getView方法中添加一条日志,发现运行后该日志并没有打印出来,说明getView方法并没有执行

2、检查传入自定义Adapter的数据列表ArrayList,在ArrayList添加数据后添加日志打印,发现运行后日志能打印出数据,说明ArrayList中是有数据的

 

三、问题:

为什么传入自定义Adapter中的ArrayList是有数据,但是却显示不出来?

 

四、分析:

重新看了一遍代码中相关的listView以及Adapter部分

ArrayList数据部分:

List<BluetoothDevice> mPairedDevList = new ArrayList<BluetoothDevice>();
List<BluetoothDevice> mNewDevList = new ArrayList<BluetoothDevice>();

自定义Adapter部分:

MyPairedDeviceAdapter mPairedBlueDeviceAdapter = new BlueDeviceAdapter(this,R.layout.device_name_item,mPairedDevList);
MyNewDeviceAdapter    mNewBlueDeviceAdapter = new BlueDeviceAdapter(this,R.layout.device_name_item,mNewDevList);

ListView绑定Adapter部分:

ListView mPairedDeviceListView = findViewById(R.id.paired_device_list_view);
ListView mNewDeviceListView = findViewById(R.id.new_device_list_view);
mPairedDeviceListView.setAdapter(mPairedBlueDeviceAdapter);
mNewDeviceListView.setAdapter(mNewBlueDeviceAdapter);

1、发现我三部分的代码都是写在onCreate中,添加数据到ArrayList的部分代码写在后面,也就是说,我后面添加到ArrayList中的数据都没有加载到ListView中,导致后面放进ArrayList中的数据没有显示。

2、我创建ArrayList后并没有添加任何数据就绑定ListVIew,导致ArrayList中的数据为空,这种情况当然不能显示出来。

 

五、解决方案:

(一)对于不需要改变ArrayList中的内容的,即ListView布局中的内容是固定不变的情况

  • 先将所需要显示的数据添加到空的ArrayList中

  • 然后将带有数据的ArrayList对象作为参数传入自定义MyAdapter的第三个参数中

  • 最后将ListView绑定MyAdapter

例子:

//创建mArrayList对象
ArrayList<device> myArrayList = new ArrayList<device>();

//添加所需显示的数据到mArrayList中
myArrayList.add(device1);
myArrayList.add(device2);

//将mArrayList传入到MyAdapter的MyAdapter对象
MyAdapter myAdapter = new MyAdapter(this,R.layout.xxx,myArrayList);

//将ListView绑定MyAdapter
mListView.setAdapter(myAdapter);

注意:这种情况ArrayList必须先传入数据,否则ArrayList为空,这样的话ListView布局中就没有数据了

(二)对于ArrayList内容会变化,即ListView布局中的内容会改变的情况

  • 在ArrayLIst每次添加数据后,调用自定义Adapter的notifyDataSetChanged()方法

官方文档中的解释如下:

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

意思大致是:

每次该方法调用的时候会检查Adapter中传入的数据是否有改变,并且对改动数据相关的View进行相应的更新

因此每次自定义MyAdapter中的数据ArrayList改变的时候,调用该方法即可刷新改动数据对应的布局,显示更新后的布局

例子:

//创建mArrayList对象
ArrayList<device> myArrayList = new ArrayList<device>();

//将mArrayList传入到MyAdapter的MyAdapter对象
MyAdapter myAdapter = new MyAdapter(this,R.layout.xxx,myArrayList);

//将ListView绑定MyAdapter
mListView.setAdapter(myAdapter);

//添加数据
myArrayList.add(device1);
myArrayList.add(device2);

//刷新
MyAdapter.notifyDataSetChanged();

注意:notifyDataSetChanged()方法在检查到数据变动后会调用getView重新加载一遍显示的数据,达到更新ListView布局的效果

 

六、总结:

对于ListView数据显示问题,个人认为getView方法是否调用以及传入的数据是否为空是显示问题的关键,可以先检查在ListView绑定Adapter前,自己传入Adapter中的数据是否为空,如果为空的话,连数据都没有,当然是不会调用getView的,因此也显示不出来。

 

如有错误,欢迎指正,虚心学习!

 

 

 

 

 

 

 

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 应用程序将 MySQL 数据ListView 显示,可以按照以下步骤操作: 1. 创建一个包含 ListView 的布局文件。 2. 在 Java 代码创建一个继承自 AsyncTask 的类,以便在后台线程连接到 MySQL 数据库并获取数据。 3. 在 doInBackground() 方法执行查询数据库的操作,并将结果存储在一个 ArrayList 。 4. 在 onPostExecute() 方法,使用 ArrayAdapter 将 ArrayList 数据加载到 ListView 。 以下是一个示例代码,演示如何将 MySQL 数据ListView 显示: 1. 在布局文件添加 ListView: ``` <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="#b5b5b5" android:dividerHeight="1dp"/> ``` 2. 创建 AsyncTask 类来连接到 MySQL 数据库并获取数据: ``` private class GetDataFromDatabase extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); // 显示进度对话框 } @Override protected Void doInBackground(Void... params) { try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection(DB_URL, USER, PASS); Statement statement = connection.createStatement(); String query = "SELECT * FROM table_name"; ResultSet resultSet = statement.executeQuery(query); while (resultSet.next()) { String data = resultSet.getString("column_name"); dataList.add(data); } resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); // 隐藏进度对话框 ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, dataList); listView.setAdapter(adapter); } } ``` 3. 在 onCreate() 方法执行 AsyncTask: ``` listView = (ListView) findViewById(R.id.list_view); new GetDataFromDatabase().execute(); ``` 这样就可以将 MySQL 数据ListView 显示了。注意,为了安全起见,请确保在连接到 MySQL 数据库时使用正确的用户名和密码,并使用预编译语句来防止 SQL 注入攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值