参悟网址:ListView套用EditText完美解决方案_qiantanlong的博客-优快云博客
问题说明:
listview中嵌套Editext会导致焦点获取问题,输入的内容混乱问题、无法正常输入问题等等
原因:
ListView的自条目会复用控件,导致edittext数据混乱,焦点的获取出现问题
Activity
public class ListViewActivity extends Activity {
private ListView lv_list;
private ItemAdapter itemAdapter;
private List<Bean> list;
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (itemAdapter!=null){
itemAdapter.notifyDataSetChanged();
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
list = new ArrayList<>();
lv_list = findViewById(R.id.lv_list);
itemAdapter = new ItemAdapter(this,list);
lv_list.setAdapter(itemAdapter);
itemAdapter.setOnItemClick(new ItemAdapter.OnListener() {
@Override
public void onItemClickListener(int i,Bean bean) {
System.out.println("条目点击事件");
}
});
}
}
基类
clas Bean{
public String name;
public String note;
}
重点:适配器
public class ItemAdapter extends BaseAdapter implements View.OnClickListener, View.OnTouchListener, View.OnFocusChangeListener,
View.OnLongClickListener{
private Context context;
private List<Bean> list;
public ItemAdapter(Context context, List<Bean> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
if (convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.item_list, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.et_item.setOnTouchListener(this);
viewHolder.et_item.setOnFocusChangeListener(this);
viewHolder.et_item.setTag(i);
Bean bean = list.get(i);
viewHolder.tv_item.setText(bean.name);
if (selectedEditTextPosition != -1 && i == selectedEditTextPosition) { // 保证每个时刻只有一个EditText能获取到焦点
viewHolder.et_item.requestFocus();
} else {
viewHolder.et_item.clearFocus();
}
//ll_item是布局item_list中父控件的ID
convertView.setTag(R.id.ll_item, i); // 应该在这里让convertView绑定position
convertView.setOnClickListener(this);
convertView.setOnLongClickListener(this);
return convertView;
}
private int selectedEditTextPosition = -1;
private TextWatcher mTextWatcher = new MyTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (selectedEditTextPosition != -1) {
Bean bean = (Bean) getItem(selectedEditTextPosition);
bean.note = s.toString();
//保持条目Bean中的note是对于Editext最新的内容
}
}
};
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
EditText editText = (EditText) v;
selectedEditTextPosition = (int) editText.getTag();
}
return false;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
EditText editText = (EditText) v;
if (hasFocus) {
editText.addTextChangedListener(mTextWatcher);
} else {
editText.removeTextChangedListener(mTextWatcher);
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.ll_item) {
int position = (int) view.getTag(R.id.ll_item);
listener.onItemClickListener(position,list.get(position));
}
}
@Override
public boolean onLongClick(View view) {
if (view.getId() == R.id.ll_item) {
int position = (int) view.getTag(R.id.ll_item);
}
return true;
}
class ViewHolder{
@InjectView(R.id.tv_item)
TextView tv_item;
@InjectView(R.id.et_item)
TextView et_item;
ViewHolder(View view) {
ButterKnife.inject(this, view);
}
}
OnListener listener;
public void setOnItemClick(OnListener listener){
this.listener = listener;
}
public interface OnListener{
void onItemClickListener(int position,Bean bean);
}
}