1
  • 最佳答案
     @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);
                }
            });
        }
    


    这个方法,会多次执行,你把这些view弄成了成员变量,有什么意义呢?你这么写的话,所有的东西都是表示最后一个。指向最后一个。


        public void setConnectingIcon() {
                if(mConnectingIcon != null && mConnectIcon != null){
                    mConnectingIcon.setVisibility(View.VISIBLE);
                    mConnectIcon.setVisibility(View.GONE);
                }
    
        }
    


    来,你告诉我,mConnectingIcon指的是哪个控件呢?


    你都没能理解onBindViewHolder的作用呢?这个会多次调用,只要有数据显示就会调用。因为要绑定数据,如果你看到10条数据,就会调用10~12次。


    明白了吗?


    你正确的做法是:


    1、补习基础知识,RecyclerView要会用,适配器里各个方法的作用和调用时机;

    2、当RecyclerView里的Item数据发生改变时,你怎么样去更新?这个你都不知道呢!!!!先要更新数据,然后再notifyDataSetChange一下才是呀。

    3、要好好学习基础,否则这些很简单的问题,会浪费你和他人的大量时间 。




    1153952789488054272  评论     打赏       拉大锯
    • CHENJIAHUA  回复 @拉大锯
      感谢康师傅指点,这项目上手催的急。还好康师傅指点了我,非常感谢!今天就得推出测试版本了,上手这个项目基本都是百度 谷歌 加上之前做项目的有类似的思路都套进去。基础确实学的不好。诶,这个问题以后不能再犯了。谢谢康师傅了~
      CHENJIAHUA 2020-09-25 14:49   回复 1226683515316211712
    • 拉大锯  回复 @CHENJIAHUA
      问题是你现在明白了没有呀?其他先不管吧,先解决你这个问题。你这个问题的出现是因为你改成了成员变量,所以指向的是最后一个item。你应该在你的数据列表里加多一个状态项,然后onBindViewHolder的时候,根据状态去显示。你的wifi状态变以后,修改list里对应的bean状态,然后notifyDataSetChange,就可以更新了。
      拉大锯 2020-09-25 15:00   回复 1153952789488054272
    • CHENJIAHUA  回复 @拉大锯
      我明白了康师傅,现在我改一下。我适配器获取到的数据列表的bean类添加一个状态项然后在广播接受中设置一下这个bean类的状态项。 adapter中的onBindViewHolder中写一个根据状态项显示ui的。这样应该可以了~
      CHENJIAHUA 2020-09-25 15:17   回复 1226683515316211712
    • 拉大锯  回复 @CHENJIAHUA
      对嘛,你这个说话才是对的。所以你状态更新的时候,应该是更新集合里的item的状态,然后通知更新,就会重新走onBindViewHolder这个方法了。
      拉大锯 2020-09-25 16:00   回复 1153952789488054272
  • 更新的姿势不对啊。想看看更新的代码是怎么写的。

    1139423796017500160  评论     打赏       断点-含光君
    • CHENJIAHUA  回复 @断点-含光君
      我也觉得写的怪怪的。就是fragment1 跳到fragment2,回到fragment1。然后修改fragment 1 点击的item项的UI。wifi连接中显示progress,连接成功显示 √。
      CHENJIAHUA 2020-09-22 14:49   回复 1226683515316211712
    • 断点-含光君  回复 @CHENJIAHUA
      你点击了那个item,是不是应该把对应的index记录起来。当你返回1的时候,是不是应该把index返回来。然后加状态一起返回啊。 你先看看,你传过去的点击的item的index,在返回来的时候,是不是同一个,打log就知道了。这样你更新的时候,就知道是不是更新错误了啊。
      断点-含光君 2020-09-22 23:04   回复 1139423796017500160
    • CHENJIAHUA  回复 @断点-含光君
      好勒,今天我再研究一下。不行也只能先跳开他搞下一步了,功能也都实现了的。就是UI显示的不对。
      CHENJIAHUA 2020-09-23 09:30   回复 1226683515316211712
  • 怎么没看到你点确定后更新数据的代码?

    尽量贴全一点吧

    1247069679944470528  评论     打赏       lxxxx9
    • 1、onClick里的所有东西,都不可以改成成员变量,因为它只属于当前的Item


      也就是说,这个 mCurrentPos = position; //获取当前点击的pos,不能这么干。


      2、密码长度判断,提示没有,log没有


      if(mPasswordEt.getText().toString().length() < 8){

      return;

      }


      看来你改密码的代码没什么。


      遇到这些问题不是很简单么?


      • 你改完密码,是不是Item要loading?你根本就没有修改数据变化并且notifyDatasetChange呀?至于状态,这里你定位到问题了吗?是没有收到广播?还是没有设置密码成功?这个不是可以打开设置看看吗?
      • 如果这样还排除不了,跟wifi相关的,完全可以去看系统settings里的代码。
      • 如果Item要更新,是不是应该更新数据然后notifydatasetchange一下?



      1153952789488054272  评论     打赏       拉大锯
      • CHENJIAHUA  回复 @拉大锯
        康师傅,那我修改状态的话。是在点击DialogFragment 中的yes按钮执行dismiss()后就调用修改吗?因为我在广播修改的话,是可以修改UI。出现的问题我贴出来。
        CHENJIAHUA 2020-09-22 16:30   回复 1226683515316211712
      • 拉大锯  回复 @CHENJIAHUA
        如果你的广播能收到正在连接的状态,不需要修改。通过广播更新即可。
        拉大锯 2020-09-22 19:25   回复 1153952789488054272
      • CHENJIAHUA  回复 @拉大锯
        我是在广播接收中修改的,就是wifi也连上去了,也连对了。就是UI没改对。我今天再重新改一下看看~谢谢康师傅了
        CHENJIAHUA 2020-09-23 09:29   回复 1226683515316211712
      • 拉大锯  回复 @CHENJIAHUA
        哪里没对?是没收到广播还是怎么滴?看log
        拉大锯 2020-09-23 10:23   回复 1153952789488054272
      • CHENJIAHUA  回复 @拉大锯
        广播有收到,能更新。这部分的UI更新是根据广播接收wifi状态搞的。但是我图那里有两个item项,点第一个刷新第二个item的ui。这里我去打印我点击的position,没有问题。点第二个item,是正常刷新。 我问了同事,说得根据点击的ssid 或者bssid 判断一下再更新。我先把点击的log贴出来。
        CHENJIAHUA 2020-09-24 17:48   回复 1226683515316211712
      • 拉大锯  回复 @CHENJIAHUA
        点第一个刷新第二个item的ui--->为什么?也就是说,你的第二个Item是根据什么刷新的呢?对吧。
        拉大锯 2020-09-24 18:06   回复 1153952789488054272
      • CHENJIAHUA  回复 @拉大锯
        康师傅,我两个都是根据广播接受者 接受wifi状态进行更新的。只是不清楚为啥无论点击哪个,都只是更新第二个(我这里只有两个item)。
        CHENJIAHUA 2020-09-25 13:37   回复 1226683515316211712
      • 拉大锯  回复 @CHENJIAHUA
        这个问题这么简单,而且还是必现的。从你上面的广播接收到的代码来看,你啥也没干。就只有一个地方notifyDatasetChange,前面让你给的适配器代码又没给出来哦。这种问题这么简单,数据从哪来到哪去,搞通了,就解决了。
        拉大锯 2020-09-25 13:43   回复 1153952789488054272
    • 现在都不知道你的问题点是啥呢?


      看了你的点击确定的代码,这里确定以后,就去改wifi的密码。然后呢?


      问题是啥呢?



      无论我点击哪个item项,都是更新position 为 1 的item项。


      这个吗?


      那就看你的点击代码吧,这相关的代码得给出来。

      1153952789488054272  评论     打赏       拉大锯
      • CHENJIAHUA  回复 @拉大锯
        康师傅我重新贴了代码,之前的问题写的太粗糙了
        CHENJIAHUA 2020-09-22 14:44   回复 1226683515316211712
    • 你看看,你这个代码这里


              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");
              }
      


      关于适配器的操作就这个     mNoConnectListAdapter.notifyDataSetChanged();
      


      然后,你数据有更新过吗?有操作过吗?

      1153952789488054272  评论     打赏       拉大锯
      • CHENJIAHUA  回复 @拉大锯
        康师傅,我把我显示的recyclerView 的adapter 和 item项layout ,广播接收者代码都贴出来了。您帮我瞅瞅~ 我广播连接成功那部分打印的log ssid 显示出来的跟我点击的项的ssid是一致的。
        CHENJIAHUA 2020-09-25 14:10   回复 1226683515316211712
      • 拉大锯  回复 @CHENJIAHUA
        我看了你代码了。你没有理解适配器呀。你得把RecyclerView的课程学习一次。学院里有。我再写个答案给你点评一下。
        拉大锯 2020-09-25 14:39   回复 1153952789488054272
    • 结果是什么方式回传回去就用什么方式更新ui吧。adapter就notifyDataSetChanged()。viewmodel的话就直接可以通过观察者刷新
      


      1305843151033982976  评论     打赏       菜鸟一只
      相关问题
      我不行了 · fragment
      2020-02-23 02:17 599 2
      huperly · Fragment
      2020-03-21 19:06 643 4
      2020-04-10 04:49 494 2
      CHENCC · Fragment
      2020-04-15 22:45 788 2
      2020-07-13 22:31 738 2
      风林火山 · fragment
      2020-11-21 22:49 880 2