安卓开发将IP地址发布在ListView中

在安卓APP中,我想实现将扫描到的IP地址展示在ListView里,发现扫描IP是成功的,但是无法将数据显示在Lv里面,不知道是适配器的问题还是什么错误,求指导。以下是我的main代码“:
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener, AdapterView.OnItemClickListener {

private static final int TIMEOUT_MS = 500;
private static final int PORT = 80;
private static final String TAG = "Main";

private CheckBox ck_IP; // 声明一个复选框对象
private TextView mTextView; // 声明一个文本视图对象
private ListView lv_ip; // 声明一个用于展示IP设备的列表视图对象
private List mIPList ; // IP设备列表
private IPListAdapter ipListAdapter;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ck_IP = findViewById(R.id.ck_IP);
        mTextView =(TextView) findViewById(R.id.mTextView);
        lv_ip = findViewById(R.id.lv_ip);
        mIPList = new ArrayList<>();
    ipListAdapter = new IPListAdapter(this, mIPList);
    lv_ip.setAdapter(ipListAdapter); // 设置适配器
    lv_ip.setOnItemClickListener(this);
    ck_IP.setOnCheckedChangeListener(this);


}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if (buttonView.getId() == R.id.ck_IP) {
        if (isChecked) {
            ck_IP.setText("开");
            scanIpAddress();
            Log.d( TAG,"扫描结束,总共成功扫描到");
        } else {
            ck_IP.setText("关");
            mIPList.clear();
            ipListAdapter.notifyDataSetChanged();
        }
    }
}

@Override
public void onItemClick(AdapterView adapterView, View view, int position, long l) {
    Intent intent = new Intent(this, VideoShowActivity.class);
    intent.putExtra("address", mIPList.get(position).ipAddress);
    startActivity(intent);
}

private class ScanIpAddressTask extends AsyncTask{

@Override
protected List doInBackground(Void... voids) {
    String subnet = getSubnet();
    for (int i = 0; i <= 255; i++) {
        String host = subnet + "." + i;
        try {
            InetAddress address = InetAddress.getByName(host);
            if (address.isReachable(TIMEOUT_MS)) {
                IPDevice device = new IPDevice(host, "Camera 1", PORT);
                device.ipAddress = host;
                device.port = PORT;
                mIPList.add(device);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return mIPList;
}

@Override
protected void onPostExecute(List mIPList) {

    ipListAdapter.notifyDataSetChanged();
}

}

private void scanIpAddress() {

    new ScanIpAddressTask().execute();
}

private String getSubnet() {
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    if (wifiManager != null) {
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int ip = wifiInfo.getIpAddress();
        return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF);
    }
    return "";
}

}

望采纳
在扫描IP地址的时候没有将扫描到的IP地址添加到mIPList中,导致ListView中没有数据显示。你可以在扫描IP地址的时候将扫描到的IP地址添加到mIPList中,然后调用ipListAdapter.notifyDataSetChanged()方法来更新ListView中的数据。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据提供的代码,可以看出以下几个问题:

  1. IPListAdapter 的实现没有提供,不确定其是否正确实现了适配器的方法。需要确认是否正确实现适配器的方法。
  2. ScanIpAddressTask 的返回值类型是 List,但是在 onPostExecute 方法中并没有对其进行处理,需要确认在 onPostExecute 方法中适配器是否正确地使用了 mIPList,以及是否需要将 List 类型转换为 IPDevice 类型。
  3. 在 doInBackground 方法中,mIPList 变量被添加到了一个线程中,但是它的变化并没有在主线程中更新 UI。需要在 onPostExecute 方法中将 mIPList 添加到适配器,并调用 notifyDataSetChanged() 方法以更新 UI。

建议你在 onPostExecute 方法中修改代码如下:

@Override
protected void onPostExecute(List<IPDevice> mIPList) {
    ipListAdapter.clear();
    ipListAdapter.addAll(mIPList);
    ipListAdapter.notifyDataSetChanged();
}

这里使用 addAll() 方法将扫描到的 IP 列表添加到适配器中,同时使用 clear() 方法清空原有的数据,以确保每次刷新 UI 的时候都是最新的数据。