首页 > 解决方案 > SearchView 过滤器,在列表视图中获得正确的位置

问题描述

当过滤结果显示在列表视图中以及选择过滤结果时,如何获取正确的项目,它将在另一个片段中显示正确的输出,到目前为止,这是我的当前代码。

当前问题输出: 问题

到目前为止我的代码:

YourGroup.java

package com.findforme.www.myapplication;


import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Filter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class YourGroup extends Fragment implements SearchView.OnQueryTextListener,SearchView.OnCloseListener{

    private String TAG = YourGroup.class.getSimpleName();
    private ListView gridView;
    private SearchView mSearchView;
    ListAdapterShowGroups adapter;

    ArrayList<your_groups> your_groupList;

    public static YourGroup newInstance() {
        YourGroup fragment = new YourGroup();
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void findViews(View view) {

        your_groupList = new ArrayList<>();
        mSearchView = view.findViewById(R.id.floating_search_view);
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnCloseListener(this);
        gridView = view.findViewById(R.id.lv_showGroup);
        gridView.setTextFilterEnabled(false);
        new GetGroups().execute();


    }

    @Override
    public boolean onClose() {
        final FilterHelper filterHelper = new FilterHelper(your_groupList,adapter,getActivity());
        adapter = new ListAdapterShowGroups(filterHelper.currentList,getActivity());
        gridView.setAdapter(adapter);
        return false;
    }

    @Override
    public boolean onQueryTextSubmit(String s) {
        adapter.getFilter().filter(s);
        return false;
    }

    @Override
    public boolean onQueryTextChange(String query) {
        adapter.getFilter().filter(query);
        return false;
    }

    public static class FilterHelper extends Filter{
        ArrayList<your_groups> currentList;
        ListAdapterShowGroups adapter;
        Context c;

        FilterHelper(ArrayList<your_groups> currentList, ListAdapterShowGroups adapter, Context c){
            this.currentList = currentList;
            this.adapter = adapter;
            this.c = c;
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();

            if(constraint != null && constraint.length()>0){
                constraint = constraint.toString().toLowerCase();

                ArrayList<your_groups> foundFilters = new ArrayList<>();

                your_groups your_group = null;

                for (int i=0;i<currentList.size();i++){
                    your_group = currentList.get(i);

                    if(your_group.GroupName.toLowerCase().contains(constraint)){
                        foundFilters.add(your_group);
                    }
                }

                filterResults.count=foundFilters.size();
                filterResults.values=foundFilters;

            } else {
                filterResults.count =currentList.size();
                filterResults.values=currentList;
            }
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

            if(filterResults.count == 0){
                adapter.invalidate();
            } else {
                adapter.setYourGroups((ArrayList<your_groups>)filterResults.values);
                adapter.refresh();
            }
        }
    }


    private class GetGroups extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Toast.makeText(getActivity(), "Retrieving data", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            HttpHandler sh = new HttpHandler();

            int id = MainActivity.user.getId();
            String user_id = Integer.toString(id);

            //String url = "https://findforme2018.000webhostapp.com/show_groups_joined.php?id="+user_id;
            String url = "http://192.168.211.1/Capstone%202018/FindForMe/show_groups_joined.php?id="+user_id;
            String jsonStr = sh.makeServiceCall(url);

            Log.e(TAG, "Response from url: " + jsonStr);
            if( jsonStr != null){
                try{
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    JSONArray groups = jsonObj.getJSONArray("group_join");

                    your_groups your_groups;

                    your_groupList = new ArrayList<>();

                    for (int i = 0; i < groups.length(); i++){
                        JSONObject c = groups.getJSONObject(i);

                        your_groups = new your_groups();

                        your_groups.setGroupName(c.getString("group_name"));
                        your_groups.setId(c.getInt("group_id"));

                        your_groupList.add(your_groups);

                    }
                }catch (final JSONException e){
                    Log.e(TAG, "Error: " + e.getMessage());
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getActivity(),
                                    "No groups join yet",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                }
            }
            else {
                Log.e(TAG, "Couldn't get json from server.");
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getActivity(),
                                "Couldn't get json from server. Check LogCat for possible errors!",
                                Toast.LENGTH_LONG).show();
                    }
                });
            }


            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            adapter = new ListAdapterShowGroups(your_groupList,getActivity());
            gridView.setAdapter(adapter);
                gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                        int id = your_groupList.get(i).id;
                        String group_id = Integer.toString(id);
                        String groupname = your_groupList.get(i).GroupName;

                        Bundle args = new Bundle();
                        args.putString("group_id", group_id);
                        args.putString("groupname", groupname);

                        SelectedGroup fragment = new SelectedGroup();
                        fragment.setArguments(args);

                        Toast.makeText(getActivity(),
                                groupname,
                                Toast.LENGTH_LONG).show();

                        FragmentManager fragmentManager = getFragmentManager();
                        fragmentManager.beginTransaction()
                                .replace(R.id.content_main
                                        , fragment).addToBackStack(null).commit();




                    }
                });
        }
    }

    View myView;

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

        myView = inflater.inflate(R.layout.fragment_your_group, container, false);
        findViews(myView);
        return myView;


    }
}

这是在列表视图及其过滤器中显示数据的适配器

package com.findforme.www.myapplication;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

public class ListAdapterShowGroups extends BaseAdapter implements Filterable{

    Context context;
    private ArrayList<your_groups> valueList;
    private YourGroup.FilterHelper filterHelper;

    ListAdapterShowGroups(ArrayList<your_groups> listValue, Context context)
    {
        this.context = context;
        this.valueList = listValue;
    }

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

    @Override
    public Object getItem(int position)
    {
        return this.valueList.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        ListAdapterShowGroups.ViewItem viewItem;

        if(convertView == null)
        {
            viewItem = new ListAdapterShowGroups.ViewItem();

            LayoutInflater layoutInflater = (LayoutInflater)this.context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            convertView = layoutInflater.inflate(R.layout.customgroup_layout,null);

            viewItem.image = convertView.findViewById(R.id.groupImage);
            viewItem.groupname = convertView.findViewById(R.id.tv_groupName);

            convertView.setTag(viewItem);
        }
        else
        {
            viewItem = (ListAdapterShowGroups.ViewItem)convertView.getTag();
        }


        viewItem.groupname.setText(valueList.get(position).getGroupName());
        String img = valueList.get(position).getGroupName();

        //Glide.with(this.context).load("https://findforme2018.000webhostapp.com/Group_Image/"+img+".jpg").asBitmap().into(viewItem.image);

        Glide.with(this.context).load("http://192.168.211.1/Capstone%202018/FindForMe/Group_Image/"+img+".jpg").asBitmap().into(viewItem.image);


        return convertView;
    }

    public void setYourGroups(ArrayList<your_groups> filteredYourGroups){
        this.valueList = filteredYourGroups;
    }

    @Override
    public Filter getFilter() {
        if(filterHelper == null){
            filterHelper = new YourGroup.FilterHelper(valueList,this,context);
        }

        return filterHelper;
    }

    public void refresh(){
        notifyDataSetChanged();
    }

    public void invalidate(){
        notifyDataSetInvalidated();
    }

    class ViewItem {
        Integer id;
        TextView groupname;
        ImageView image;
    }
}

your_groups.java
package com.findforme.www.myapplication;

public class your_groups {
    public String GroupName;
    public Integer id;

    public int getId(){
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getGroupName(){
        return GroupName;
    }

    public void setGroupName(String GroupName){
        this.GroupName = GroupName;
    }

}

标签: androidlistviewsearchview

解决方案


listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override

    public void onItemClick(AdapterView<?> parent, View view,
    int position, long id) {
         // TODO Auto-generated method stub 
         text_view.setText(adapter.getItem(position - 1) + "");
    }
});

推荐阅读