在我的应用中,作为ViewHolder的一部分,我有一个带有可编辑EditText视图的RecyclerView,请参见图片:
用户可以编辑EditText视图的值。要将更改后的值保存回相关适配器,请将OnFocusChangeListener设置为EditText视图,并在它们失去焦点后立即存储(已更改)值,请参阅以下代码段,摘录自适配器的onBindViewHolder方法:
// Add listener to views
holder.fpuView.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
// Focus has gone, so save value to adapter
mAbsorptionBlocks.get(position).setMaxFPU(Integer.valueOf(holder.fpuView.getText().toString()));
}
});
holder.absorptionTimeView.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
// Focus has gone, so save value to adapter
mAbsorptionBlocks.get(position).setAbsorptionTime(Integer.valueOf(holder.absorptionTimeView.getText().toString()));
}
});
这很好,只要用户点击另一个EditText视图即可。
如果用户在更改EditText的值后立即直接单击“保存”按钮,则该按钮不起作用。 EditText似乎无法识别已失去焦点。这可能是由于“保存”按钮不属于RecyclerView,而是属于父活动。
我尝试了其他听众选项,但是现在我很迷路。用户在编辑值后直接单击“保存”按钮,是否有机会抓住更改的值?
答案 0 :(得分:1)
改为使用OnTestChangeListener
。然后,根据需要捕获文本更改后事件或实时捕获。这样,您就不必依赖焦点更改事件来获取文本。
答案 1 :(得分:1)
您必须使用EditText的这些方法
holder.fpuView.addTextChangedListener(new
TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int
start,int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(s.length() != 0) {
mAbsorptionBlocks.get(position). setMaxFPU(Integer.valueOf(holder.fpuView.getText().toString()));
}else{
// add default value when EditText is empty.
}
} });