账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    ListView中的TextView嵌套PopupWindow,TextView无法修改
    37
    0

    问题:
    小弟写了一个ListView,ListView的item中有一个是TextView。当我点击TextView的时候,会弹出一个PopupWindow。PopupWindow中是一个ListView。

    当点击PopupWindow中的ListView的时候,需要把 PopupWindow中的ListView的值传给TextView。问题是,我debug,看见了TextView的值明明改变了,但是在页面中的TextView的值却没有改变

    代码:

    ListView中的适配器

    public class OperatorLogItem extends BaseAdapter {
    
    
        private Context mcontext;
        private LayoutInflater mInflater;
        private TextView tv_operator_mark;
        private PopupWindow pw_operator_mark;   // 弹框
        private List<String> mOperatorMarkList = new ArrayList<>(); //弹出的窗体的数据
        private AddItemListView mAddItemListView;
        private  AddItemListViewAdapter mAddItemListViewAdapter;
    
        Spinner mSpOperatorMark ,mSpOperatorRecord,mSpOperatorSignature;
    
        EditText etOperatorAllTime, etOperatorBeginTime, etOperatorOverTime,etOperatorRemark;
    
        public OperatorLogItem(Context context) {
            super();
            this.mcontext = context;
            this.mInflater = LayoutInflater.from(mcontext);
            // 因为多个OperatorLogItem 共用一个 ListView,所以只初始化一次。
            initTvClickPopupWindowData(mOperatorMarkList);
            mAddItemListView = new AddItemListView(mcontext);
            mAddItemListViewAdapter = new AddItemListViewAdapter(mcontext,mOperatorMarkList);
            mAddItemListView.setAdapter(mAddItemListViewAdapter);
        }
    
        @Override
        public int getCount() {
            return 8;
        }
    
        @Override
        public Object getItem(int i) {
            return null;
        }
    
        @Override
        public long getItemId(int i) {
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = mInflater.inflate(R.layout.lv_item_log,null);
            // 修改部分
            tv_operator_mark = (TextView) v.findViewById(R.id.tv_operator_mark);
            tv_operator_mark.setText(mOperatorMarkList.get(0));
            initTvClickPopupWindow(tv_operator_mark);
            //  mSpOperatorMark = (Spinner) v.findViewById(R.id.sp_operator_mark);
            mSpOperatorRecord = (Spinner) v.findViewById(R.id.sp_operator_record);
            mSpOperatorSignature = (Spinner) v.findViewById(R.id.sp_operator_signature);
    
    //            mSpOperatorMark.setAdapter(ArrayAdapter.createFromResource(MainActivity.this,R.array.operatorLogMark,R.layout.multiline_spinner_dropdown_item));
            mSpOperatorRecord.setAdapter(ArrayAdapter.createFromResource(mcontext,R.array.operatorLogRecord,R.layout.multiline_spinner_dropdown_item));
            mSpOperatorSignature.setAdapter(ArrayAdapter.createFromResource(mcontext,R.array.operatorLogSignature,R.layout.multiline_spinner_dropdown_item));
    
            etOperatorAllTime = (EditText) v.findViewById(R.id.et_operator_all_time);
            etOperatorBeginTime = (EditText) v.findViewById(R.id.et_operator_begin_time);
            etOperatorOverTime = (EditText) v.findViewById(R.id.et_operator_over_time);
            etOperatorRemark = (EditText) v.findViewById(R.id.et_operator_remark);
            return v;
        }
    
        //初始化弹出窗体中的数据
        private void initTvClickPopupWindowData(List<String> list) {
            String [] arrays = mcontext.getResources().getStringArray(R.array.operatorLogMark);
            if(arrays != null) {
                for (String s : arrays) {
                    list.add(s);
                }
            }
        }
    
        //初始化点击TextView 弹出窗体
        private void initTvClickPopupWindow(TextView tv) {
            //初始化窗体
            tv.post(new Runnable() {
                @Override
                public void run() {
                    pw_operator_mark = new PopupWindow(mAddItemListView, RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT,true);
                    pw_operator_mark.setTouchable(true);
                    pw_operator_mark.setOutsideTouchable(true);
                    // 这句话是必须写的,虽然不知道为什么!!
                    pw_operator_mark.setBackgroundDrawable(new BitmapDrawable(mcontext.getResources(), (Bitmap) null));
                }
            });
            // 点击弹出窗体
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    pw_operator_mark.showAsDropDown(v);
                }
            });
        }

    PopupWindow中ListView的适配器

     class AddItemListViewAdapter extends BaseAdapter {
    
            private Context mContext;
            private LayoutInflater mInflater;
            private List<String> data;
    
            public AddItemListViewAdapter(Context mContext, List<String> data) {
                this.mContext = mContext;
                mInflater = LayoutInflater.from(mContext);
                this.data = data;
            }
    
    
            @Override
            public int getCount() {
                return data.size();
            }
    
            @Override
            public Object getItem(int position) {
                return data.get(position);
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
            @Override
            public View getView(final int position, View view, ViewGroup parent)     {
                ViewHolder vh;
                vh = new ViewHolder();
                view = mInflater.inflate(R.layout.item, null);
                vh.tvContent = (TextView) view.findViewById(R.id.tv_content);
                vh.tvDelete = (TextView) view.findViewById(R.id.tv_delete);
                vh.tvContent.setText(data.get(position));
                vh.tvDelete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        data.remove(position);
                        notifyDataSetChanged();
                    }
                });
                vh.tvContent.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                     tv_operator_mark.setText(data.get(position));
                        pw_operator_mark.dismiss();
                    }
                });
                return view;
            }
        }
        static class ViewHolder {
            TextView tvContent;
            TextView tvDelete;
        }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 给我看得见的在乎 普通会员 1楼

      在ListView中,TextView是显示文本的组件,而PopupWindow是显示弹出窗口的组件。在使用这两种组件时,需要进行适当的交互,以实现你想要的效果。

      如果你想要在ListView中显示一个TextView,并且这个TextView需要显示一个PopupWindow,你可以按照以下步骤操作:

      1. 创建一个TextView和一个PopupWindow。你可以在XML布局文件中创建这些组件。

      ```xml

      <TextView
          android:id="@+id/textView"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Hello, World!" />
      
      <PopupWindow
          android:id="@+id_popupWindow"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="top|center_horizontal" />
      

      ```

      1. 在你的MainActivity中,创建一个方法来处理PopupWindow的关闭事件。

      ```java public class MainActivity extends AppCompatActivity {

      private TextView textView;
      private PopupWindow popupWindow;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          textView = findViewById(R.id.textView);
          popupWindow = findViewById(R.id.popupWindow);
      
          // 设置PopupWindow的大小和位置
          popupWindow.setSize(200, 200);
          popupWindow.setPosition(100, 100);
      
          // 当popupWindow关闭时,显示一个通知
          popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
              @Override
              public void onDismiss() {
                  Toast.makeText(MainActivity.this, "PopupWindow dismissed", Toast.LENGTH_SHORT).show();
              }
          });
      }
      

      } ```

      现在,当你在ListView中点击TextView时,PopupWindow将自动显示。如果你想在TextView中添加更多的文本,你可以在onCreate方法中添加更多的TextView,并在onDismiss方法中更新PopupWindow的内容。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部