Как получить исходные позиции элементов списка после фильтрации? - PullRequest
0 голосов
/ 23 сентября 2018

Возможно, это будет помечено как дубликат, но я просмотрел все посты, связанные с моей проблемой, и никто из них не исправил их, поэтому я пишу свой пост, чтобы посмотреть, сможет ли кто-нибудь конкретно помочьменя.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я ищу что-то в моем списке, положение нарушается.Поэтому, если у меня есть представление списка AA, BB, CC, AB, и я ищу A, он вернет AA, AB, как и положено, но если я нажму на AB, это даст мне BB, так как AB сейчас в позиции1 вместо 3. Как я могу получить исходные позиции моих данных для моего слушателя onclick?Спасибо.

Вот мой пользовательский класс просмотра списка:

public class CustomListViewClass {

// Store the id of the  movie poster
private String mEquation;
// Store the name of the movie
public String mName;
public int previousPosition;

// Constructor that is used to create an instance of the CustomListViewClass object
public CustomListViewClass(String mName, String mEquation) {
    this.mEquation = mEquation;
    this.mName = mName;
}

public String getmEquation() {
    return mEquation;
}

public void setmEquation(String mEquation) {
    this.mEquation = mEquation;
}

public String getmName() {
    return mName;
}

public void setmName(String mName) {
    this.mName = mName;
}

} 

Мой пользовательский адаптер просмотра списка:

public class CustomListviewAdapter extends ArrayAdapter<CustomListViewClass> implements Filterable  {

//Define list items
TextView textView;
TextView formula_two;

//Define list
private Context mContext;
private List<CustomListViewClass> moviesList = new ArrayList<>();
private List<CustomListViewClass> moviesListFiltered = new ArrayList<>();

private int layoutResource;

public CustomListviewAdapter(@NonNull Context context, @LayoutRes ArrayList<CustomListViewClass> list) {
    super(context, 0 , list);
    mContext = context;
    moviesList = list;
    moviesListFiltered = list;

}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    View listItem = convertView;
    if(listItem == null)
        listItem = LayoutInflater.from(mContext).inflate(R.layout.row_layout,parent,false);

    CustomListViewClass currentMovie = moviesListFiltered.get(position);

    textView = (TextView) listItem.findViewById(R.id.textView);
    textView.setText(currentMovie.getmName());
    TextView equation = (TextView) listItem.findViewById(R.id.formula_one);
    equation.setText(currentMovie.getmEquation());

    return listItem;
}

int previousPosition;

public int getPreviousPosition() {
    return previousPosition;
}


public void setPreviousPosition(int previousPosition) {
    this.previousPosition = previousPosition;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getCount() {
    return moviesListFiltered.size();
}


@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            if (constraint == null || constraint.length() == 0) {
                //no constraint given, just return all the data. (no search)
                results.count = moviesList.size();
                results.values = moviesList;
            } else {//do the search
                List<CustomListViewClass> resultsData = new ArrayList<>();
                String searchStr = constraint.toString().toUpperCase();
                for (CustomListViewClass o : moviesListFiltered)
                    if (o.mName.toUpperCase().startsWith(searchStr)) resultsData.add(o);
                results.count = resultsData.size();
                results.values = resultsData;
            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            moviesListFiltered = (ArrayList<CustomListViewClass>) results.values;
            notifyDataSetChanged();
        }
    };
}
}

И мой основной фрагмент

public class MainEquations extends ListFragment {

private ListView listView; //Main listview
private CustomListviewAdapter mAdapter; //Custom adapter for listview
private AlertDialog.Builder builder;
public static final String TAG = MainEquations.class.getSimpleName();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.main_equations, container, false);
    setHasOptionsMenu(true);

    //Find listview in xml
    listView = (ListView) view.findViewById(R.id.listView);
    ArrayList<CustomListViewClass> equationsList = new ArrayList<>();

    //Populate listview with items
    equationsList.add(new CustomListViewClass( "Ampere's Law" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Angular Acceleration" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Angular Velocity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Belt Velocity" , "V = (πdₘnₘ)/12"));
    equationsList.add(new CustomListViewClass( "Bolt Stress Area" , "A = π/4(dₙ - 0.9743/n)²"));
    equationsList.add(new CustomListViewClass( "Brake Clamp Load" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Buoyant Force" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Conductivity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Coulomb's Law" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Darcy's Law" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Density" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Drag Force" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Dynamic Viscosity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Elastic Potential Energy" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Electric Field" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Engineering Strain" , "ε = ΔL/L₀"));
    equationsList.add(new CustomListViewClass( "Engineering Stress" , "σ = F/A₀"));
    equationsList.add(new CustomListViewClass( "Escape Velocity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Flow Head Loss" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Fluid Pressure" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Fluid Surface Tension" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Force" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Fracture Toughness" , "Kᵢc = Yσ⋅Sqrt(πa)"));
    equationsList.add(new CustomListViewClass( "Gauss Law" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Gibb's Free Energy" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Gravitational Force" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Gravitational Potential Energy" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Horsepower using Belt Velocity/Force" , "HP = (Fb⋅Vb)/33000"));
    equationsList.add(new CustomListViewClass( "Ideal Gas Law" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Induced Voltage" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Kinematic Viscosity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Kinetic Energy" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Mach Number" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Magnetic Force Charge" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Moment" , "F⋅d"));
    equationsList.add(new CustomListViewClass( "Momentum" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Nernst Equation" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Ohms Law" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Open Channel Water Flow" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Orbital Velocity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Orifice Discharge" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Pump Power" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Refraction" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Resistivity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Resonant Frequency" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Reynolds Number" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Rotational Kinetic Energy" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Shear Modulus" , "G = τ/γ"));
    equationsList.add(new CustomListViewClass( "Shear Strain" , "γ = τ/G"));
    equationsList.add(new CustomListViewClass( "Shear Stress" , "τ = F/A"));
    equationsList.add(new CustomListViewClass( "Shear Stress of Linear Helical Spring" , "τ = Kₛ(8FD/πd³)"));
    equationsList.add(new CustomListViewClass( "Surface Charge Density" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Thermal Deformation" , "δₜ = αL(T - T₀)"));
    equationsList.add(new CustomListViewClass( "Torque" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Velocity" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Voltage Divider" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Voltage Drop" , "Placeholder"));
    equationsList.add(new CustomListViewClass( "Young's Modulus" , "E = σ/ε"));



    mAdapter = new CustomListviewAdapter(getActivity(),equationsList);
    listView.setAdapter(mAdapter);

    //Set onClick functions for listview
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapter, View arg1,
                                int position, long arg3) {

            switch(position) {
                case 15:
                setVariables("Engineering Strain",
                        "<center>$$\\epsilon = \\frac{\\Delta L}{L_0}$$</center>",
                        "\\(Unitless\\)",
                        "\\(\\Delta L = \\mathrm{change~in~length~in~}in, mm\\)",
                        "\\(L_0 = \\mathrm{original~area~in~}in, mm\\)");
                break;
                case 16:
                setVariables("Engineering Stress",
                        "<center>$$\\sigma = \\frac{F}{A_0}$$</center>",
                        "\\(Pa, MPa, psi, kpsi\\)",
                        "\\(F = \\mathrm{axial~force~in~}N, kip\\)",
                        "\\(A_0 = \\mathrm{cross~sectional~area~in~} m^2, ft^2\\)");
                break;
                case 2:
                setVariables("Moment",
                        "<center>$$M= F{\\cdot}d$$</center>",
                        "\\(lb{\\cdot}ft, N{\\cdot}m\\)",
                        "\\(F = \\mathrm{force~in~}N, lb\\)",
                        "\\(d = \\mathrm{distance~of~radial~arm~in~} m, ft\\)");
                break;
                case 3:
                setVariables("Shear Stress",
                        "<center>$$\\epsilon = \\frac{\\Delta L}{L_0}$$</center>",
                        "\\(Unitless\\)",
                        "\\(\\Delta L = \\mathrm{change~in~length~in~}in, mm\\)",
                        "\\(L_0 = \\mathrm{original~area~in~}in, mm\\)");
                break;

            }
        }
    });

    return view;

}

public void setVariables(String title, String equation, String units, String variable_one, String variable_two) {
    Bundle info = new Bundle();
    info.putString("KEY_TITLE", title);
    info.putString("KEY_EQUATION", equation);
    info.putString("KEY_UNITS", units);
    info.putString("KEY_VARIABLES_ONE", variable_one);
    info.putString("KEY_VARIABLES_TWO", variable_two);
    FragmentManager fm = getActivity().getFragmentManager();
    CustomEquationsDialog dialog = new CustomEquationsDialog();
    dialog.setArguments(info);
    dialog.show(fm, TAG);
}

//Alert function for dialog
public void alert (String title, String message) {
    builder = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Light_Dialog);
    builder.setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // continue with delete
                }
            })
            .show();
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    //Stuff
}

//Options menu created
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_equations, menu);
    super.onCreateOptionsMenu(menu,inflater);

    final SearchView searchView2 = (SearchView) menu.findItem(R.id.item_search).getActionView();

    searchView2.setIconifiedByDefault(false);
    searchView2.setQueryHint("Search Here");
    searchView2.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextChange(String newText) {
            Filter filter = mAdapter.getFilter();
            if (TextUtils.isEmpty(newText)) {
                listView.clearTextFilter();
                filter.filter(newText);
            } else {
                filter.filter(newText);
                listView.setFilterText(newText);
            }
            mAdapter.notifyDataSetChanged();
            return true;
        }
        public boolean onQueryTextSubmit(String query) {
            searchView2.clearFocus(); //Close searchview when enter button pressed
            return true;
        }
    });

}

}

1 Ответ

0 голосов
/ 23 сентября 2018

Попробуйте ниже одного заменить ниже двух методов

@NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        View listItem = convertView;
        if(listItem == null)
            listItem = LayoutInflater.from(mContext).inflate(R.layout.row_layout,parent,false);

        CustomListViewClass currentMovie = moviesList.get(position);

        textView = (TextView) listItem.findViewById(R.id.textView);
        textView.setText(currentMovie.getmName());
        TextView equation = (TextView) listItem.findViewById(R.id.formula_one);
        equation.setText(currentMovie.getmEquation());

        return listItem;
    }

и ваш фильтр должен быть как ниже

@Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                if (constraint == null || constraint.length() == 0) {
                    //no constraint given, just return all the data. (no search)
                    moviesList = moviesListFiltered;
                } else {//do the search
                    List<CustomListViewClass> resultsData = new ArrayList<>();
                    String searchStr = constraint.toString().toUpperCase();
                    for (CustomListViewClass o : moviesListFiltered)
                        if (o.mName.toUpperCase().startsWith(searchStr)) resultsData.add(o);
                    moviesList = resultsData;
                }
                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                moviesList = (ArrayList<CustomListViewClass>) results.values;
                notifyDataSetChanged();
            }
        };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...