如何指向在 Android 的 ListView 中动态生成的 EditText 元素?

Posted

技术标签:

【中文标题】如何指向在 Android 的 ListView 中动态生成的 EditText 元素?【英文标题】:How can I point to EditText elements that are generated dynamically in a ListView in Android? 【发布时间】:2015-04-02 03:51:42 【问题描述】:

我在 ListFragment 中创建了一个 ListView,它是动态填充的,我不知道会有多少项目在那里。现在我需要用户为 ListView 中的每个项目设置 EditTexts 的文本,以便通过单击一个按钮来保存此文本。我的问题是,实际上我在布局中只有一个 EditText 时,如何指向每个项目的 EditText。我的代码只是将第一个 EditText 文本保存在列表中。有人有想法吗?我很抱歉!我对 android 有点陌生。

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) 
        final ViewHolder viewHolder;
        // General ListView optimization code.
        if (view == null) 
            view = mInflater.inflate(R.layout.listitem_device, null);
            viewHolder = new ViewHolder();
            viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
            viewHolder.deviceName = (EditText) view.findViewById(R.id.device_name);
            view.setTag(viewHolder);
         else 
            viewHolder = (ViewHolder) view.getTag();
        

        BluetoothDevice device = mLeDevices.get(i);
        viewHolder.deviceAddress.setText(device.getAddress());

        saveNode.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View arg0) 
                for (int j = 0; j < mLeDeviceListAdapter.getCount() ; j++) 
                    String name = viewHolder.deviceName.getText().toString();
                    String address = viewHolder.deviceAddress.getText().toString();
                    handler = new DataHandler(getActivity().getBaseContext());
                    handler.open();
                    handler.insertNode(address, name);
                    Toast.makeText(getActivity().getBaseContext(), "Node " + name + " inserted", Toast.LENGTH_LONG).show();
                    handler.close();
                
            
        );

        return view;
    

【问题讨论】:

我试图理解您的问题,但似乎无法弄清楚您在寻找什么。你可以说得更详细点吗?您是否在列表项中添加 EditTexts? 感谢您的评论,尤金!我实际上有一个列表视图,其中每个列表项都有一个 EditText。这些列表项是我扫描的蓝牙设备。现在我需要用户为列表中显示的每个设备写一个他选择的名称,然后单击一个按钮“保存”以保存所有这些名称。但是,如何为列表视图中的每个 editText 使用 editText.getText() ?!我正在使用适配器,我只是在布局中重复单个 editText,而 EditText id 将仅引用 listView 中的第一个元素,而不是全部! 抱歉有点晚了。我去看看 我醒来后会发布代码。我想我对您要完成的工作有所了解。您想在列表视图编辑文本中获取每个名称。如果我错了,请纠正我。 就是这样!我只是不知道如何处理这些 EditText 倍数来获取他们的数据。非常感谢您的回复!非常感谢! 【参考方案1】:

实际上我根本不应该在 getView() 中使用按钮 onClick 方法。它应该在 onCreate 中,如下所示:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    rootView = inflater.inflate(R.layout.scan_activity, container, false);

    mHandler = new Handler();
    saveNode = (Button) rootView.findViewById(R.id.save_node_button);

    saveNode.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View arg0) 
            for (int j = 0; j < mLeDeviceListAdapter.getCount() ; j++) 

                int wantedPosition = j; // Whatever position you're looking for
                int firstPosition = mLeDeviceListView.getFirstVisiblePosition() - mLeDeviceListView.getHeaderViewsCount(); // This is the same as child #0
                int wantedChild = wantedPosition - firstPosition;
                // Say, first visible position is 8, you want position 10, wantedChild will now be 2
                // So that means your view is child #2 in the ViewGroup:
                if (wantedChild < 0 || wantedChild >= mLeDeviceListView.getChildCount()) 
                  //Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
                  return;
                
                // Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
                View wantedView = mLeDeviceListView.getChildAt(wantedChild);

                nodeName = (EditText) wantedView.findViewById(R.id.device_name);
                nodeAddress = (TextView) wantedView.findViewById(R.id.device_address);

                name = nodeName.getText().toString();
                address = nodeAddress.getText().toString();

                handler = new DataHandler(getActivity().getBaseContext());
                handler.open();
                handler.insertNode(address, name);
                Toast.makeText(getActivity().getBaseContext(), "Node " + name + " inserted", Toast.LENGTH_LONG).show();
                handler.close();
             
        
    );
    return rootView;

getView() 函数应该是这样的:

@Override
    public View getView(int i, View view, ViewGroup viewGroup) 
        final ViewHolder viewHolder;
        // General ListView optimization code.
        if (view == null) 
            view = mInflater.inflate(R.layout.listitem_device, null);
            viewHolder = new ViewHolder();
            viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
            viewHolder.deviceName = (EditText) view.findViewById(R.id.device_name);
            view.setTag(viewHolder);
         else 
            viewHolder = (ViewHolder) view.getTag();
        

        BluetoothDevice device = mLeDevices.get(i);
        viewHolder.deviceAddress.setText(device.getAddress());
        return view;
    

【讨论】:

以上是关于如何指向在 Android 的 ListView 中动态生成的 EditText 元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中处理 ListView 点击

android如何改变listview的每行高度

如何禁用在android中单击ListView?

如何在android的listview中获取项目的视图?

如何在Android中处理ListView单击

Android:如何在这个 ListView 中设置图像?