Android 在某些ListView列上应用侦听器

Android 在某些ListView列上应用侦听器,android,listview,Android,Listview,背景: 我创建了一个包含三列的列表视图,产品和价格。第一列定义为TextView(其值自动生成),接下来的两列定义为EditText(其值由用户填写) 我想要什么: 我想在以下情况下向列表视图添加新行: 用户在任何EditText 没有空的EditText(这意味着到目前为止定义的所有EditText中都有一些值) 基本上我想显示一个新的订单列表,用户可以在其中添加订单 到目前为止我的代码: 列表视图模型: 列表视图适配器: 我应该把那个听众放在哪里?我如何检查任何列是否为空(定义noEmpty

背景:

我创建了一个包含三列的
列表视图
产品
价格
。第一列定义为
TextView
(其值自动生成),接下来的两列定义为
EditText
(其值由用户填写)

我想要什么:

我想在以下情况下向
列表视图添加新行:

  • 用户在任何
    EditText
  • 没有空的
    EditText
    (这意味着到目前为止定义的所有
    EditText
    中都有一些值)
  • 基本上我想显示一个新的订单列表,用户可以在其中添加订单

    到目前为止我的代码:

    列表视图模型:

    列表视图适配器:


    我应该把那个听众放在哪里?我如何检查任何列是否为空(定义
    noEmptyColumn()
    )?

    您应该将
    侦听器放置在任何
    EditText
    值更改的位置。我会在任何一行中添加一个
    按钮
    ,并在那里设置
    侦听器
    。因此,在您的
    视图持有者中

    saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                boolean hasEmpty = false;
                for (NewTableModel item: productList) {
                    if (item.getDesiredField().isEmpty()) {
                        hasEmpty = true;
                        break;
                    }
                }
                if (!hasEmpty) {
                    insertNewRow();
                    notifyDataSetChanged();
                }
                
            }
        });
    
    另一个选项可以是在
    EditText
    上设置
    TextWatcher

    ed.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                boolean hasEmpty = false;
                for (NewTableModel item: productList) {
                    if (item.getDesiredField().isEmpty()) {
                        hasEmpty = true;
                        break;
                    }
                }
                if (!hasEmpty) {
                    insertNewRow();
                    notifyDataSetChanged();
                }
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        });
    

    只需将这两个方法移动到
    适配器
    类。请注意,第二种解决方案在行太多时效率不高。

    当用户在没有空的
    EditText
    (所有
    product
    price
    已填充)时按enter键添加新行时,
    onKey
    的目的是什么
    ?@GabrieleMariotti你能帮忙吗plz@DougStevenson你能帮助plzI不需要任何按钮吗?我想用当前代码或更好的代码来做,你在哪里检查任何
    EditText
    是否为空?我编辑了答案@Ahtisham。你应该根据你的条件更正
    for loop
    public class MainActivity extends AppCompatActivity {
        
        
        private ArrayList<NewTableModel> productList;
        private ListView orderView;
        private NewTableAdapter orderAdapter;
        
    
        private void insertNewRow(){ insertNewRow("",""); }
    
        private void insertNewRow(String productVal, String priceVal){
    
            String serialNoVal = String.valueOf(orderView.getCount() + 1);
            NewTableModel item = new NewTableModel(serialNoVal, productVal, priceVal);
            productList.add(item);
        }
    
        private void setupAdapter(){
            productList = new ArrayList<NewTableModel>();
            orderView = (ListView) findViewById(R.id.newTableContent);
            orderAdapter = new NewTableAdapter(this, productList);
            orderView.setAdapter(orderAdapter);
            orderAdapter.notifyDataSetChanged();
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity);
            setupAdapter();
            insertNewRow();
        }
    
    }
    
      setOnKeyListener(new View.OnKeyListener() {
           @Override
           public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER 
                    && noEmptyColumn())
                    insertNewRow();
                return false;
            }
      });
    
    saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                boolean hasEmpty = false;
                for (NewTableModel item: productList) {
                    if (item.getDesiredField().isEmpty()) {
                        hasEmpty = true;
                        break;
                    }
                }
                if (!hasEmpty) {
                    insertNewRow();
                    notifyDataSetChanged();
                }
                
            }
        });
    
    ed.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                boolean hasEmpty = false;
                for (NewTableModel item: productList) {
                    if (item.getDesiredField().isEmpty()) {
                        hasEmpty = true;
                        break;
                    }
                }
                if (!hasEmpty) {
                    insertNewRow();
                    notifyDataSetChanged();
                }
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        });