ListView中的TextView嵌套PopupWindow,TextView无法修改

问题:
小弟写了一个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;
    }
阅读 2.3k
1 个回答

pw_operator_mark怎么找到属于自己的tv_operator_mark?tv.post是异步吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题