Применить прослушиватель к некоторым столбцам ListView - PullRequest
0 голосов
/ 02 августа 2020

Фон:

Я создал ListView с тремя столбцами sNo, product и price. Первый столбец определяется как TextView (значение которого создается автоматически), а следующие два столбца - EditText (значение которого заполняется пользователем).

Что я хочу:

Я хочу добавить новую строку в ListView всякий раз, когда:

  1. Пользователь нажимает клавишу ввода на любом EditText
  2. Пустого нет EditText (что означает, что все EditText, определенные до сих пор, имеют в себе какое-то значение).

В основном я хочу отображать новый список заказов, в котором пользователи могут добавлять заказы.

Мой код на данный момент:

Модель ListView:

public class NewTableModel {

    private String sNo, product, price;

    public NewTableModel(String sNo, String product, String price){
        this.sNo = sNo;
        this.product = product;
        this.price = price;
    }

    public String getProduct(){ return product; }
    public String getPrice(){ return price; }
    public String getsNo() { return sNo; }
}

Адаптер ListView:

public class NewTableAdapter extends BaseAdapter {

    private ArrayList<NewTableModel> productList;
    private Activity activity;

    public NewTableAdapter(Activity activity, ArrayList<NewTableModel> productList) {
        super();
        this.activity = activity;
        this.productList = productList;
    }

    @Override
    public int getCount() { return productList.size(); }

    @Override
    public Object getItem(int position) { return productList.get(position); }

    @Override
    public long getItemId(int position) { return position; }

    public class ViewHolder {

        TextView mSno;
        EditText mProduct;
        EditText mPrice;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        LayoutInflater inflater = activity.getLayoutInflater();

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.new_table_row, null);
            holder = new ViewHolder();
            holder.mSno = (TextView) convertView.findViewById(R.id.sno);
            holder.mProduct = (EditText) convertView.findViewById(R.id.product);
            holder.mPrice = (EditText) convertView.findViewById(R.id.price);
            convertView.setTag(holder);
        } else 
            holder = (ViewHolder) convertView.getTag();            

        NewTableModel item = productList.get(position);
        holder.mSno.setText(item.getsNo());
        holder.mProduct.setText(item.getProduct());
        holder.mPrice.setText(String.valueOf(item.getPrice()));

        return convertView;
    }
}

MainActivity:

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

Где мне разместить этого слушателя? и как мне проверить, пуст ли какой-либо столбец (определите noEmptyColumn())?

1 Ответ

0 голосов
/ 02 августа 2020

Вы должны поместить listener там, где изменяется любое из EditText значений. Я бы добавил Button в любую строку и установил listener там. Итак, в вашем ViewHolder:

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

Другим вариантом может быть установка TextWatcher на EditText:

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

        }
    });

Просто переместите оба метода в свой Adapter класс. Обратите внимание, что второе решение неэффективно при слишком большом количестве строк.

...