首页 > 解决方案 > 从过滤列表视图输入数据时,如何在存储的项目中获取数据?

问题描述

问题是当我选择一个项目时,我可以获取存储在项目中的数据,在 EditText 中输入一些内容并单击它旁边的 ImageButton:选择项目并输入一些数据

单击 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 新手,我花了很多时间试图解决它,所以欢迎帮助并非常感谢。提前致谢。

标签: androidlistviewfiltering

解决方案


试试下面的代码: -

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();
    }
}

}

推荐阅读