是因为ListView默认会将焦点交给其子项,而EditText是可以接收用户输入的控件。为了禁止用户在ListView中输入,可以通过以下两种方式实现:
public class MyAdapter extends BaseAdapter {
private List<String> data;
private LayoutInflater inflater;
public MyAdapter(Context context, List<String> data) {
this.data = data;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.editText = convertView.findViewById(R.id.editText);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.editText.setText(data.get(position));
holder.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
// 清空EditText的内容
data.set(position, "");
}
});
return convertView;
}
private static class ViewHolder {
EditText editText;
}
}
public class MyAdapter extends BaseAdapter {
private List<String> data;
private LayoutInflater inflater;
public MyAdapter(Context context, List<String> data) {
this.data = data;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.editText = convertView.findViewById(R.id.editText);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.editText.setText(data.get(position));
holder.editText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 返回true表示已经处理了触摸事件,不再将焦点交给EditText
return true;
}
});
return convertView;
}
private static class ViewHolder {
EditText editText;
}
}
以上两种方式都可以实现在ListView中禁止用户输入EditText的效果。在实际应用中,可以根据具体需求选择合适的方式。
领取专属 10元无门槛券
手把手带您无忧上云