重新编辑一下:
需求:
我想要实现的 UI给的效果图

代码删掉没有提交,现在写不回去了。不过反正都没有满足需求。
/1/ 这个是我获取到并且过滤剩的wifi信息。有两个item项。

/2/现在我需要点击,弹出输入密码框。红框部分是获取点击的wifi name。这个点击获取到的没有问题。

点击的代码:
@Override
protected void initListener() {
//ITEM项的点击事件
mNoConnectListAdapter.setOnItemClickListener(new DeviceNoConnectListAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
mCurrentPos = position; //获取当前点击的pos
WifiManager wifiManager = (WifiManager) requireContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager != null && wifiManager.isWifiEnabled()) {
Router router = sRouterList.get(mCurrentPos);
// Logger.d(TAG,"position -- ?> " + position + " item name -- > "+ router.getName());
// NLMeshToast.getInstance(getContext()).showShortToast("position --- > " + position + "router name -- > " + router.getName());
noConfigurationWifi(mCurrentPos); //需要密码,弹出输入密码的Dialog
}else {
intentToOpenWifiService(); //跳转到打开wifi的系统设置界面
}
}
});
}
/3/
执行这一方法:noConfigurationWifi(mCurrentPos)
/**
* 之前没配置过该网络, 弹出输入密码界面
* @param position
*/
private void noConfigurationWifi(int position) {
Logger.d(TAG,"current click pos" + position);
NLMeshToast.getInstance(getContext()).showShortToast("current click pos " + position);
WifiLinkDialogFragment wifiLinkDialogFragment = new WifiLinkDialogFragment();
wifiLinkDialogFragment.getData(mScanResultArrayList.get(position));
wifiLinkDialogFragment.show(getChildFragmentManager(),"");
}
我用的是DialogFragment 实现输入框
输入框显示后,输入完点击YES按钮。
这里的点击事件代码如下:
mConfirmBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPasswordEt.getText().toString().length() < 8){
return;
}else {
//实现wifi连接
NLMeshToast.getInstance(getContext()).showShortToast("click yes btn");
WifiSupport.WifiCipherType wifiCipher = WifiSupport.getWifiCipher(mCapabilities);
WifiConfiguration config = WifiSupport.createWifiConfig(mItem.SSID, mInputPassword, wifiCipher);
boolean result = WifiSupport.addNetWork(config, requireContext()); //连接指定wifi,返回连接wifi的结果
Logger.d(TAG,"wifi connect result --- > " + result);
dismiss(); //关闭输入框
}
}
});
mCancelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//关闭输入框
dismiss();
}
});
我的广播接收者代码: -- 网上例程改的。
public static class WifiBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())){
int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
switch (state){
/**
* WIFI_STATE_DISABLED WLAN已经关闭
* WIFI_STATE_DISABLING WLAN正在关闭
* WIFI_STATE_ENABLED WLAN已经打开
* WIFI_STATE_ENABLING WLAN正在打开
* WIFI_STATE_UNKNOWN 未知
*/
case WifiManager.WIFI_STATE_DISABLED:{
Log.d(TAG,"wifi disable");
NLMeshToast.getInstance(NLApplication.getContext()).showShortToast("wifi disable");
break;
}
case WifiManager.WIFI_STATE_DISABLING:{
Log.d(TAG,"wifi disabling");
break;
}
case WifiManager.WIFI_STATE_ENABLED:{
Log.d(TAG,"wifi enabled");
break;
}
case WifiManager.WIFI_STATE_ENABLING:{
Log.d(TAG,"wifi enabling");
break;
}
case WifiManager.WIFI_STATE_UNKNOWN:{
Log.d(TAG,"unknown state");
break;
}
}
}else if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Log.d(TAG, "--NetworkInfo--" + info.toString());
if(NetworkInfo.State.DISCONNECTED == info.getState()){//wifi没连接上
Log.d(TAG,"wifi connect error");
mNoConnectListAdapter.notifyDataSetChanged();
}else if(NetworkInfo.State.CONNECTED == info.getState()) {//wifi连接上了
Log.d(TAG, "wifi connected");
NLMeshToast.getInstance(NLApplication.getContext()).showShortToast("wifi connected");
}else if(NetworkInfo.State.CONNECTING == info.getState()){
Log.d(TAG,"wifi connecting");;
}
}else if(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())){
Log.d(TAG,"network list change");
}
}
}
这部分的代码大致是这样了。
在广播接受者 中根据接收到的wifi状态修改UI,出现以下问题:
(1 )点击NL-2,4g的item

(2)
点击wlan 5g的,输入完 在连接过程中,更新的也是NL2.4的item ui,成功后修改的也是2,4g的ui。
跟上面的图一样。
------------------分割线 --------------------------------
item项layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="80dp">
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="33dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:src="@drawable/add_device_ico_router"
android:layout_marginLeft="33dp" />
<TextView
android:id="@+id/select_device_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="100dp"
android:text="device1"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="100dp" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ico_right"
android:layout_marginRight="40dp" />
<ImageView
android:id="@+id/select_device_icon_connected"
android:layout_width="30dp"
android:layout_height="20dp"
android:layout_marginEnd="10dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/imageView3"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/select_device_ico_connected"
android:layout_marginRight="10dp" />
<ProgressBar
android:id="@+id/select_device_icon_connecting"
style="?android:attr/progressBarStyle"
android:layout_width="35dp"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:visibility="gone"
android:indeterminateDrawable="@drawable/select_device_connecting"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/imageView3"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginRight="10dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
adapter
public class DeviceNoConnectListAdapter extends RecyclerView.Adapter<DeviceNoConnectListAdapter.InnerHolder> {
private static final String TAG = "DeviceNoConnectListAdapter";
private TextView mDeviceName;
private List<Router> resultList = new ArrayList<>();
private OnItemClickListener mItemListener = null;
private ImageView mConnectIcon;
private ProgressBar mConnectingIcon;
private boolean mIsAddSuccess = false;
private View mConnectingView;
private boolean isProgress;
private String mName;
public DeviceNoConnectListAdapter() {
}
@NonNull
@Override
public DeviceNoConnectListAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_select_devices, parent, false);
return new InnerHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull DeviceNoConnectListAdapter.InnerHolder holder, int position) {
mDeviceName = holder.itemView.findViewById(R.id.select_device_name);
mConnectIcon = holder.itemView.findViewById(R.id.select_device_icon_connected);
mConnectingIcon = holder.itemView.findViewById(R.id.select_device_icon_connecting);
mName = resultList.get(position).getName();
mDeviceName.setText(mName);
//点击List 的 Item项
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mItemListener.onItemClick(position);
}
});
}
@Override
public int getItemCount() {
return resultList.size();
}
public void setConnectIcon() {
if (mConnectingIcon != null && mConnectIcon != null) {
mConnectingIcon.setVisibility(View.GONE);
mConnectIcon.setVisibility(View.VISIBLE);
}
}
public void setConnectingIcon() {
if(mConnectingIcon != null && mConnectIcon != null){
mConnectingIcon.setVisibility(View.VISIBLE);
mConnectIcon.setVisibility(View.GONE);
}
}
public static class InnerHolder extends RecyclerView.ViewHolder {
public InnerHolder(@NonNull View itemView) {
super(itemView);
}
}
public void setRouterData(List<Router> list){
Logger.d(TAG,"setCurScanDevicesDataAfterSort list === 》 " + list.size());
this.resultList.clear();
resultList.addAll(list);
notifyDataSetChanged();
}
public void setOnItemClickListener(OnItemClickListener listener){
this.mItemListener = listener;
}
public interface OnItemClickListener {
void onItemClick(int position);
}
}
广播
public static class WifiBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())){
int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
switch (state){
/**
* WIFI_STATE_DISABLED WLAN已经关闭
* WIFI_STATE_DISABLING WLAN正在关闭
* WIFI_STATE_ENABLED WLAN已经打开
* WIFI_STATE_ENABLING WLAN正在打开
* WIFI_STATE_UNKNOWN 未知
*/
case WifiManager.WIFI_STATE_DISABLED:{
Log.d(TAG,"wifi disable");
NLMeshToast.getInstance(NLApplication.getContext()).showShortToast("wifi disable");
break;
}
case WifiManager.WIFI_STATE_DISABLING:{
Log.d(TAG,"wifi disabling");
break;
}
case WifiManager.WIFI_STATE_ENABLED:{
Log.d(TAG,"wifi enabled");
break;
}
case WifiManager.WIFI_STATE_ENABLING:{
Log.d(TAG,"wifi enabling");
break;
}
case WifiManager.WIFI_STATE_UNKNOWN:{
Log.d(TAG,"unknown state");
break;
}
}
}else if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Log.d(TAG, "--NetworkInfo--" + info.toString());
if(NetworkInfo.State.DISCONNECTED == info.getState()){//wifi没连接上
Log.d(TAG,"wifi connect error");
mNoConnectListAdapter.notifyDataSetChanged();
}else if(NetworkInfo.State.CONNECTED == info.getState()) {//wifi连接上了
Log.d(TAG, "wifi connected");
WifiInfo wifiInfo = WifiSupport.getConnectedWifiInfo(context);
String ssid = wifiInfo.getSSID();
Logger.d(TAG,"正在连接的wifi SSID === > " + ssid);
//设置连接成功的UI
mNoConnectListAdapter.setConnectIcon();
NLMeshToast.getInstance(NLApplication.getContext()).showShortToast("wifi connected");
}else if(NetworkInfo.State.CONNECTING == info.getState()){
Logger.d(TAG,"current click item name --- > " +mCurrentSSID);
//设置连接中的UI
mNoConnectListAdapter.setConnectingIcon();
Log.d(TAG,"wifi connecting");;
}
}else if(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())){
Log.d(TAG,"network list change");
}
}
}
===================================
实现的部分代码:
private void wifiListSet(String ssid,String state) {
int sIndex = -1;
Router router = new Router();
for (int i = 0; i < sRouterList.size(); i++) {
Router wifiInfo = sRouterList.get(i);
if(sIndex == -1 && ("\"" + wifiInfo.getName() + "\"").equals(ssid)){
Logger.d(TAG,"wifi info --");
sIndex = i;
router.setState(state);
router.setName(wifiInfo.getName());
router.setMac(wifiInfo.getMac());
}
}
if(sIndex != -1){
sRouterList.remove(sIndex);
sRouterList.add(sIndex,router);
mNoConnectListAdapter.setRouterData(sRouterList);
mNoConnectListAdapter.notifyDataSetChanged();
}
}
如果有完美实现的思路,麻烦大伙们底下评论轰炸我。边写android代码还得边算硬件加工的成本还得搞其他杂活,自己写的代码太差了。冲冲冲!!!
这个方法,会多次执行,你把这些view弄成了成员变量,有什么意义呢?你这么写的话,所有的东西都是表示最后一个。指向最后一个。
来,你告诉我,mConnectingIcon指的是哪个控件呢?
你都没能理解onBindViewHolder的作用呢?这个会多次调用,只要有数据显示就会调用。因为要绑定数据,如果你看到10条数据,就会调用10~12次。
明白了吗?
你正确的做法是:
1、补习基础知识,RecyclerView要会用,适配器里各个方法的作用和调用时机;
2、当RecyclerView里的Item数据发生改变时,你怎么样去更新?这个你都不知道呢!!!!先要更新数据,然后再notifyDataSetChange一下才是呀。
3、要好好学习基础,否则这些很简单的问题,会浪费你和他人的大量时间 。
更新的姿势不对啊。想看看更新的代码是怎么写的。
怎么没看到你点确定后更新数据的代码?
尽量贴全一点吧
1、onClick里的所有东西,都不可以改成成员变量,因为它只属于当前的Item
也就是说,这个 mCurrentPos = position; //获取当前点击的pos,不能这么干。
2、密码长度判断,提示没有,log没有
if(mPasswordEt.getText().toString().length() < 8){
return;
}
看来你改密码的代码没什么。
遇到这些问题不是很简单么?
现在都不知道你的问题点是啥呢?
看了你的点击确定的代码,这里确定以后,就去改wifi的密码。然后呢?
问题是啥呢?
无论我点击哪个item项,都是更新position 为 1 的item项。
这个吗?
那就看你的点击代码吧,这相关的代码得给出来。
你看看,你这个代码这里
然后,你数据有更新过吗?有操作过吗?