在安卓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ᴼᴾᴱᴺᴬᴵ
根据提供的代码,可以看出以下几个问题:
建议你在 onPostExecute 方法中修改代码如下:
@Override
protected void onPostExecute(List<IPDevice> mIPList) {
ipListAdapter.clear();
ipListAdapter.addAll(mIPList);
ipListAdapter.notifyDataSetChanged();
}
这里使用 addAll() 方法将扫描到的 IP 列表添加到适配器中,同时使用 clear() 方法清空原有的数据,以确保每次刷新 UI 的时候都是最新的数据。