Я создал RecyclerView с тремя столбцами sNo
, product
и price
. Первый столбец - это TextView
, а следующие два определены как EditText
.
Значение sNo
сохраняет позицию текущего автоматически сгенерированного представления и значения product
и * 1010. * заполняются пользователем. Ниже приведен исходный вид:
I want to append a new View to the list if and only if:
Both the EditText
have some value in them.
And
When an Enter key is hit in any of the EditText
For example after populating first View I want to append a new View like this:
введите описание изображения здесь
Мой код на данный момент:
Адаптер:
public class OrderListAdapter extends RecyclerView.Adapter<OrderListAdapter.ViewHolder>{
private List<OrderListModel> orderList;
public NewOrderListAdapter(List<OrderListModel> list){ orderList = list; }
@NonNull
@Override
public OrderListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.order_list, parent, false);
return new ViewHolder(view);
}
private void addListener(EditText col){
col.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// how to append new item to recyclerview here
}
});
}
@Override
public void onBindViewHolder(@NonNull OrderListAdapter.ViewHolder holder,
int position) {
String sNo = orderList.get(position).getsNo();
String product = orderList.get(position).getProduct();
String price = orderList.get(position).getPrice();
holder.sNo.setText(sNo);
holder.product.setText(product);
addListener(holder.product);
holder.price.setText(price);
addListener(holder.price);
}
@Override
public int getItemCount() { return orderList.size(); }
public class ViewHolder extends RecyclerView.ViewHolder {
EditText product, price;
TextView sNo;
public ViewHolder(View itemView){
super(itemView);
sNo = (TextView) itemView.findViewById(R.id.sno);
product = (EditText) itemView.findViewById(R.id.product);
price = (EditText) itemView.findViewById(R.id.price);
}
}
}
MainActivity:
public class MainActivity extends AppCompatActivity {
private ArrayList<OrderListModel> orderList;
private RecycleView orderView;
private OrderListAdapter orderAdapter;
private void setupList(){
orderView = (RecyclerView) findViewById(R.id.content);
orderView.setLayoutManager(new LinearLayoutManager(this));
orderList = new ArrayList<>();
orderAdapter = new OrderListAdapter(orderList);
orderView.setAdapter(orderAdapter);
}
private void insertView(String productVal, String priceVal){
String serialNoVal = String.valueOf(orderAdapter.getItemCount() + 1);
OrderListModel item = new OrderListModel(serialNoVal, productVal, priceVal);
orderList.add(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupList();
insertView("", "");
}
}
Как добавить новое представление в мой RecyclerView при вызове слушателя onKey
?
Изменить:
Я изменил метод addListener()
следующим образом:
private void addListener(EditText col) {
col.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN &&
keyCode == KeyEvent.KEYCODE_ENTER &&
noEmptyEditText())
insertView("","");
return false;
}
});
}
Теперь есть две проблемы: как мне определить noEmptyEditText()
внутри адаптера? и как мне вызвать insertView("","")
внутри onKey
слушателя?
Edit 2:
Обновил адаптер, добавив интерфейс:
Адаптер:
public class OrderListAdapter extends RecyclerView.Adapter<OrderListAdapter.ViewHolder>{
//reset of the code
private final OnEditTextKeyListener listener;
public interface OnEditTextKeyListener {
void onEditTextKey(NewOrderListModel list);
}
public NewOrderListAdapter(List<OrderListModel> list,
OnEditTextKeyListener listener) {
orderList = list;
this.listener = listener;
}
// reset of the code and removed `addListener`
@Override
public void onBindViewHolder(@NonNull OrderListAdapter.ViewHolder holder,
int position) {
// reset of the code
holder.bind(orderList.get(position), listener);
}
// reset of the code
public class ViewHolder extends RecyclerView.ViewHolder {
// reset of the code
private void addListener(EditText product, final NewOrderListModel list,
final OnEditTextKeyListener listener){
product.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
listener.onEditTextKey(list);
return false;
}
});
}
public void bind(final NewOrderListModel list,
final OnEditTextKeyListener listener) {
addListener(product, list, listener);
}
}
}
MainActivity:
orderAdapter = new OrderListAdapter(orderList, new OrderListAdapter.OnEditTextKeyListener() {
@Override
public void onEditTextKey(OrderListModel list) {
insertView("","");
}
});
С этим обновленным кодом Теперь я могу легко добавить новый элемент, но они добавляются при нажатии любой клавиши, как уменьшить его, чтобы просто ввести клавишу?