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