android - 从过滤列表视图输入数据时,如何在存储的项目中获取数据?
问题描述
问题是当我选择一个项目时,我可以获取存储在项目中的数据,在 EditText 中输入一些内容并单击它旁边的 ImageButton:选择项目并输入一些数据
当我过滤某些字段以输入一些数据时,会发生以下情况:
数据已存储,但是当我关闭搜索视图时,数据消失了:
所以,我想要的是当我关闭搜索视图时数据被完全存储。
代码如下:
这是片段:
public class CrearProductoFragment extends Fragment {
String[] columnas;
String registros;
EditText etInsertarProd;
ImageButton insertarProd;
TextView camposNuevoProd, datosNuevoProd;
ListView lvNuevoProd;
Button btInsertarProd;
static DatosProductoAdapter productoAdapter;
int posicion;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_crear_producto, container, false);
Bundle bundle = getArguments();
columnas = bundle.getStringArray("columnas");
registros = "";
etInsertarProd = view.findViewById(R.id.etInsertarProd);
insertarProd = view.findViewById(R.id.insertarProd);
insertarProd.setEnabled(false);
insertarProd.setClickable(false);
camposNuevoProd = view.findViewById(R.id.camposNuevoProd);
camposNuevoProd.setText("Campos");
datosNuevoProd = view.findViewById(R.id.datosNuevoProd);
datosNuevoProd.setText("Datos del Registro");
lvNuevoProd = view.findViewById(R.id.lvNuevoProd);
btInsertarProd = view.findViewById(R.id.btInsertarProd);
// crear arraylist de tipo registros (crear un getDatos)
final ArrayList<Registros> listaCampos = getCampos();
// crear instancia del adaptador
productoAdapter = new DatosProductoAdapter(getContext(), listaCampos);
// asignar el adaptador al listview
lvNuevoProd.setAdapter(productoAdapter);
insertarProd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// capturar texto escrito en edittext
String texto = etInsertarProd.getText().toString();
//capturar el campo seleccionado en el listview y asignarle el texto
for (int i = 0; i < lvNuevoProd.getCount(); i++) {
if (i == posicion) {
((Registros) lvNuevoProd.getItemAtPosition(posicion)).setRegistro(texto);
}
}
productoAdapter.notifyDataSetChanged();
etInsertarProd.setText("");
insertarProd.setEnabled(false);
insertarProd.setClickable(false);
etInsertarProd.clearFocus();
insertarProd.setAlpha(0.4f);
}
//crear objeto Registros e insertarlo en el campo seleccionado
//
//int indice = lvNuevoProd.getSelectedItemPosition()-1;
//View view1 = productoAdapter.getView(indice,view,lvNuevoProd);
//Registros registro = (Registros) productoAdapter.getItem(indice);
//registro.setRegistro(texto);
//for (int cam = 0; cam < getCampos().size(); cam++){
//crearProductoAdapter.glvNuevoProd.getSelectedItem() etInsertarProd.getText()
//if () {
// Toast.makeText(getContext(), "Selecciona algún campo para introducir datos", Toast.LENGTH_SHORT).show();
//}
//}
});
lvNuevoProd.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
view.setSelected(true);
insertarProd.setAlpha(1.0f);
insertarProd.setEnabled(true);
insertarProd.setClickable(true);
etInsertarProd.requestFocus();
//registro = (Registros) productoAdapter.getItem(position);
posicion = position;
//view.findViewById(R.id.llRegistro).setSelected(true);
}
});
btInsertarProd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String cadena = "";
boolean seleccionado = false;
for (int cam = 0; cam < getCampos().size(); cam++) {
cadena = cadena + getCampos().get(cam).getRegistro();
}
if (cadena.equals("")) {
Toast.makeText(getContext(), "Campos vacíos: introduce algún dato", Toast.LENGTH_SHORT).show();
}
}
});
return view;
}
private ArrayList<Registros> getCampos() {
ArrayList<Registros> listaCampos = new ArrayList<>();
Registros r;
for (int cam = 0; cam < columnas.length; cam++) {
r = new Registros(columnas[cam], registros);
listaCampos.add(r);
}
return listaCampos;
}
public void buscarCampo(String consulta) {
productoAdapter.getFilter().filter(consulta);
}
}
这是适配器:
public class DatosProductoAdapter extends BaseAdapter implements Filterable {
Context context;
ArrayList<Registros> listaRegistros, filtradosRegistros, filters;
CustomFilter customFilter;
public DatosProductoAdapter() {
}
public DatosProductoAdapter(Context context, ArrayList<Registros> listaRegistros) {
this.context = context;
this.listaRegistros = listaRegistros;
this.filtradosRegistros = listaRegistros;
}
@Override
public int getCount() {
return listaRegistros.size();
}
@Override
public Object getItem(int position) {
return listaRegistros.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = View.inflate(this.context, R.layout.datos_producto_view, null);
viewHolder = new ViewHolder();
viewHolder.tvCamps = convertView.findViewById(R.id.tvCamps);
viewHolder.tvRegs = convertView.findViewById(R.id.tvRegs);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvCamps.setText(listaRegistros.get(position).getCampo());
viewHolder.tvRegs.setText(listaRegistros.get(position).getRegistro());
return convertView;
}
static class ViewHolder {
TextView tvCamps, tvRegs;
}
public ArrayList<Registros> getFilters() {
return filters;
}
public ArrayList<Registros> getListaRegistros() {
return listaRegistros;
}
@Override
public Filter getFilter() {
if (customFilter == null) {
customFilter = new CustomFilter();
}
return customFilter;
}
class CustomFilter extends Filter {
@Override
protected Filter.FilterResults performFiltering(CharSequence constraint) {
Filter.FilterResults results = new Filter.FilterResults();
if (constraint != null && constraint.length() > 0) {
constraint = constraint.toString().toLowerCase();
filters = new ArrayList<>();
for (int i = 0; i < filtradosRegistros.size(); i++) {
if (filtradosRegistros.get(i).getCampo().toLowerCase().contains(constraint)) {
Registros registros = new Registros(filtradosRegistros.get(i).getCampo(), filtradosRegistros.get(i).getRegistro());
filters.add(registros);
}
}
results.values = filters;
results.count = filters.size();
} else {
results.values = filtradosRegistros;
results.count = filtradosRegistros.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, Filter.FilterResults results) {
listaRegistros = (ArrayList<Registros>) results.values;
notifyDataSetChanged();
}
}
}
如您所见,Adapter 的名称与 Fragment 的名称无关,而是因为它是多个 Fragment 的通用名称。
我是 android 新手,我花了很多时间试图解决它,所以欢迎帮助并非常感谢。提前致谢。
解决方案
试试下面的代码: -
CrearProductoFragment.java:
public class CrearProductoFragment extends Fragment {
String[] columnas;
String registros;
EditText etInsertarProd;
ImageButton insertarProd;
TextView camposNuevoProd, datosNuevoProd;
ListView lvNuevoProd;
Button btInsertarProd;
static DatosProductoAdapter productoAdapter;
int posicion;
ArrayList<Registros> listaCampos = new ArrayList<>();
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_crear_producto, container, false);
Bundle bundle = getArguments();
columnas = bundle.getStringArray("columnas");
registros = "";
etInsertarProd = view.findViewById(R.id.etInsertarProd);
insertarProd = view.findViewById(R.id.insertarProd);
insertarProd.setEnabled(false);
insertarProd.setClickable(false);
camposNuevoProd = view.findViewById(R.id.camposNuevoProd);
camposNuevoProd.setText("Campos");
datosNuevoProd = view.findViewById(R.id.datosNuevoProd);
datosNuevoProd.setText("Datos del Registro");
lvNuevoProd = view.findViewById(R.id.lvNuevoProd);
btInsertarProd = view.findViewById(R.id.btInsertarProd);
// crear arraylist de tipo registros (crear un getDatos)
listaCampos = getCampos();
// crear instancia del adaptador
productoAdapter = new DatosProductoAdapter(getContext(), listaCampos);
// asignar el adaptador al listview
lvNuevoProd.setAdapter(productoAdapter);
insertarProd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// capturar texto escrito en edittext
String texto = etInsertarProd.getText().toString();
//capturar el campo seleccionado en el listview y asignarle el texto
Registros registro = listaCampos.get(posicion);
registro.setRegistro(texto);
productoAdapter.notifyDataSetChanged();
etInsertarProd.setText("");
insertarProd.setEnabled(false);
insertarProd.setClickable(false);
etInsertarProd.clearFocus();
insertarProd.setAlpha(0.4f);
}
//crear objeto Registros e insertarlo en el campo seleccionado
//
//int indice = lvNuevoProd.getSelectedItemPosition()-1;
//View view1 = productoAdapter.getView(indice,view,lvNuevoProd);
//Registros registro = (Registros) productoAdapter.getItem(indice);
//registro.setRegistro(texto);
//for (int cam = 0; cam < getCampos().size(); cam++){
//crearProductoAdapter.glvNuevoProd.getSelectedItem() etInsertarProd.getText()
//if () {
// Toast.makeText(getContext(), "Selecciona algún campo para introducir datos", Toast.LENGTH_SHORT).show();
//}
//}
});
lvNuevoProd.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
view.setSelected(true);
insertarProd.setAlpha(1.0f);
insertarProd.setEnabled(true);
insertarProd.setClickable(true);
etInsertarProd.requestFocus();
//registro = (Registros) productoAdapter.getItem(position);
posicion = productoAdapter.getItem(position);
//view.findViewById(R.id.llRegistro).setSelected(true);
}
});
btInsertarProd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String cadena = "";
boolean seleccionado = false;
for (int cam = 0; cam < getCampos().size(); cam++) {
cadena = cadena + getCampos().get(cam).getRegistro();
}
if (cadena.equals("")) {
Toast.makeText(getContext(), "Campos vacíos: introduce algún dato", Toast.LENGTH_SHORT).show();
}
}
});
return view;
}
private ArrayList<Registros> getCampos() {
ArrayList<Registros> listaCampos = new ArrayList<>();
Registros r;
for (int cam = 0; cam < columnas.length; cam++) {
r = new Registros(columnas[cam], registros);
listaCampos.add(r);
}
return listaCampos;
}
public void buscarCampo(String consulta) {
productoAdapter.getFilter().filter(consulta);
}
}
DatosProductoAdapter.java:
public class DatosProductoAdapter extends BaseAdapter implements Filterable {
Context context;
ArrayList<Registros> listaRegistros;
ArrayList<Integer> listIndex = new ArrayList<>();
CustomFilter customFilter;
public DatosProductoAdapter() {
}
public DatosProductoAdapter(Context context, ArrayList<Registros> listaRegistros) {
this.context = context;
this.listaRegistros = listaRegistros;
resetIndex();
}
public void resetIndex() {
listIndex.clear();
for (int i = 0; i < listaRegistros.size(); i++) listIndex.add(i);
}
@Override
public int getCount() {
return listIndex.size();
}
@Override
public Integer getItem(int position) {
return listIndex.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = View.inflate(this.context, R.layout.datos_producto_view, null);
viewHolder = new ViewHolder();
viewHolder.tvCamps = convertView.findViewById(R.id.tvCamps);
viewHolder.tvRegs = convertView.findViewById(R.id.tvRegs);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvCamps.setText(listaRegistros.get(getItem(position)).getCampo());
viewHolder.tvRegs.setText(listaRegistros.get(getItem(position)).getRegistro());
return convertView;
}
static class ViewHolder {
TextView tvCamps, tvRegs;
}
//public ArrayList<Registros> getFilters() {
// return filters;
//}
public ArrayList<Registros> getListaRegistros() {
return listaRegistros;
}
@Override
public Filter getFilter() {
if (customFilter == null) {
customFilter = new CustomFilter();
}
return customFilter;
}
class CustomFilter extends Filter {
@Override
protected Filter.FilterResults performFiltering(CharSequence constraint) {
if (constraint != null && constraint.length() > 0) {
listIndex.clear();
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < listaRegistros.size(); i++) {
if (listaRegistros.get(i).getCampo().toLowerCase().contains(constraint)) {
listIndex.add(i);
}
}
} else {
resetIndex();
}
return null;
}
@Override
protected void publishResults(CharSequence constraint, Filter.FilterResults results) {
notifyDataSetChanged();
}
}
}
推荐阅读
- java - 如何在 Spring Data Mongo 的 Aggregation $group 中使用 $dateToString
- javascript - 循环遍历 2 个数组和对象数组,并将数组 1 和数组 2 的元素插入到对象的某些键数组中
- kubernetes - 默认服务帐户上的 imagePullSecrets 似乎不起作用
- docker - Docker Watchtower 无法从 AWS ECR 拉取新镜像
- rust - 在 Rust 中使用单个 mutator 无锁共享数据
- c# - 如何解决“无法导入此数据库。它是不受支持的 SQL Server 版本或不受支持的数据库兼容性。”
- elisp - 用半区间法求方程的根
- java - Docker - 使用多模块 Maven 项目进行多阶段构建
- javascript -
在 ReactJS 迭代中插入 - python - Ecplipse、PyDev、Django:settings.py 中的断点有效,但视图中的断点无效