【问题标题】:How to get original positions of listview items after filtering?过滤后如何获取列表视图项的原始位置?
【发布时间】:2019-02-26 23:01:32
【问题描述】:

这可能会被标记为重复,但我已经在这里搜索了与我的问题相关的每一个帖子,但没有一个修复它,所以我正在制作自己的帖子,看看是否有人可以特别提供帮助我。

我遇到的问题是,当我在列表视图中搜索某些内容时,位置混乱了。因此,如果我有一个列表视图 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;
        }
    });

}

}

【问题讨论】:

    标签: android listview search


    【解决方案1】:

    尝试以下一种替换以下两种方法

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

    【讨论】:

    • 谢谢!但是当我现在单击工具栏中的搜索按钮时,我得到了一个空指针异常。 NullPointerException:尝试在空对象引用上调用接口方法'java.lang.Object java.util.List.get(int)' 它说问题是CustomListViewClass currentMovie = moviesList.get(position);正在返回 null
    • 你在构造函数中检查了moviesList 吗?
    • private List&lt;CustomListViewClass&gt; moviesList = new ArrayList&lt;&gt;(); 是这样定义的,但是我不知道在调用 .get(position) 时如何让它不为空
    • 你必须在适配器的绑定列表之前将调试放在构造函数中,并且你必须检查你在moviesList的构造函数中是否有数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2023-03-06
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多