列表视图的搜索功能 [英] Search Functionality for Listview

查看:20
本文介绍了列表视图的搜索功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是安卓新手.我只是想为我的应用程序制作一个简单的搜索功能.我的应用程序包含一个 ListView 一个 EditText 和一个 Button 用于搜索.我的 ListView 内容是使用扩展 BaseAdapter

i'm new to android. I'm just trying to make one simple search functionality for my app. My app consists one ListView one EditText and one Button for search. My ListView contents are listed from database using custom adapter which is extends BaseAdapter

现在,我想要做的是,我想从 ListView 中搜索任何记录例如,如果我有一些像

Now, what i'm trying to do is, i want to search any records from ListView For example, if i've some records like

优化、运营、数据挖掘、计算机伦理、计算机架构等...

Optimization, Operations, Data Mining, Computer Ethics, Computer Architecture and etc...

所以,当我输入一些记录名称时,比如 op

So, when i type some record name like op

列表视图应该列出从 op... 开始的记录参考/android/widget/TextView.html#addTextChangedListener%28android.text.TextWatcher%29" rel="noreferrer">addTextChangedListener 但是,我不知道该怎么做?

The listview should listed the records which is started from op... I've referred something for this, from i got addTextChangedListener But, i don't know how to do this?

而且,我们可以通过点击按钮来实现同样的功能

And, Can we do this same functionality with click of button

有没有人对此有任何想法?提前致谢.

Has anyone having any idea on this? Thanks in advance.

推荐答案

不久前我问过一个类似的问题.此处:使用 Baseadapter 过滤 ListView 过滤文本而非图像.虽然我的具体问题与 GridView 相关,但概念(和代码)可以代替 ListView.

I had asked a similar kinda question a while back. Here: Filtering a ListView with Baseadapter filters text not images. Although, my specific question concerned a GridView, the concept (and the code) can be substituted for a ListView.

注意:这将是一篇冗长的文章,但为了完整起见,我认为这是必要的(尽管我省略了 imports)

NOTE: This will be a lengthy post but I think necessary for the sake of completeness (I am leaving out the imports though)

主要活动(Friends.java)

public class Friends extends SherlockActivity {

    // BUNDLE OBJECT TO GET DATA FROM EARLIER ACTIVITY
    Bundle extras;

    // INITIAL ALBUM ID AND NAME
    String initialUserID;

    // THE GRIDVIEW
    GridView gridOfFriends;

    // THE ADAPTER
    FriendsAdapter adapter;

    // ARRAYLIST TO HOLD DATA
    ArrayList<getFriends> arrFriends;

    // LINEARLAYOUT TO SHOW THE FOOTER PROGRESS BAR
    LinearLayout linlaProgressBar;

    // THE EDITTEXT TO FILTER USERS
    EditText filterText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.friends_grid_list);

        extras = getIntent().getExtras();

        if (extras.containsKey("USER_ID"))  {
            initialUserID = extras.getString("USER_ID");
        } else {
            Toast.makeText(
                    getApplicationContext(), 
                    "There was a problem getting your Friends Data. Please hit the back button and try again.", 
                    Toast.LENGTH_SHORT).show();
        }

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle("Your Friends");

        // CAST THE GRIDVIEW
        gridOfFriends = (GridView) findViewById(R.id.gridFriends);

        // INSTANTIATE THE ARRAYLIST
        arrFriends = new ArrayList<getFriends>();

        // CAST THE ADAPTER
        adapter = new FriendsAdapter(Friends.this, arrFriends);

        // CAST THE LINEARLAYOUT THAT HOLDS THE PROGRESS BAR
        linlaProgressBar = (LinearLayout) findViewById(R.id.linlaProgressBar);
        linlaProgressBar.setVisibility(View.GONE);

        // GET THE LOGGED IN USERS FRIENDS DATA
        if (initialUserID != null)  {
            new getFriendsData().execute();
        } else {
            Toast.makeText(
                    getApplicationContext(), 
                    "There was a problem getting your Friends Data. Please hit the back button and try again.", 
                    Toast.LENGTH_SHORT).show();
        }

        // CAST THE EDITTEXT AND SETUP FILTERING
        filterText = (EditText) findViewById(R.id.editFilterList);
        filterText.addTextChangedListener(filterTextWatcher);
    }

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

        @Override
        protected void onPreExecute() {

            // SHOW THE BOTTOM PROGRESS BAR (SPINNER) WHILE LOADING THE FRIENDS LIST
            linlaProgressBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected Void doInBackground(Void... params) {

            try {
                String query = 
                        "SELECT name, uid, pic_big " +
                        "FROM user " +
                        "WHERE uid in " +
                        "(SELECT uid2 FROM friend WHERE uid1=me()) " +
                        "order by name";
                Bundle paramGetFriendsList = new Bundle();
                paramGetFriendsList.putString("method", "fql.query");
                paramGetFriendsList.putString("query", query);

                String resultFriendsList = Utility.mFacebook.request(paramGetFriendsList);

                JSONArray JAFriends = new JSONArray(resultFriendsList);

                getFriends friends;

                if (JAFriends.length() == 0)    {

                } else {
                    for (int i = 0; i < JAFriends.length(); i++) {
                        JSONObject JOFriends = JAFriends.getJSONObject(i);

                        friends = new getFriends();

                        // SET FRIENDS ID
                        if (JOFriends.has("uid"))   {
                            friends.setFriendID(JOFriends.getString("uid"));
                        } else {
                            friends.setFriendID(null);
                        }

                        // SET FRIENDS NAME
                        if (JOFriends.has("name"))  {
                            friends.setFriendName(JOFriends.getString("name"));
                        } else {
                            friends.setFriendName(null);
                        }

                        // SET FRIENDS PROFILE PICTURE
                        if (JOFriends.has("pic_big"))   {
                            friends.setFriendProfile(JOFriends.getString("pic_big"));
                        } else {
                            friends.setFriendProfile(null);
                        }

                        arrFriends.add(friends);

                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            // SET THE ADAPTER TO THE GRIDVIEW
            gridOfFriends.setAdapter(adapter);

            // HIDE THE BOTTOM PROGRESS BAR (SPINNER) AFTER LOADING THE FRIENDS LIST
            linlaProgressBar.setVisibility(View.GONE);
        }

    }

    private TextWatcher filterTextWatcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            adapter.getFilter().filter(s.toString().toLowerCase());
            adapter.notifyDataSetChanged();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };
}

ArrayListgetFriends.java 类:

public class getFriends {

    String friendID;
    String friendName;
    String friendProfile;

    // SET FRIENDS ID
    public void setFriendID(String friendID) {
        this.friendID = friendID;
    }

    // GET FRIENDS ID
    public String getFriendID() {
        return friendID;
    }

    // SET FRIENDS NAME
    public void setFriendName(String friendName) {
        this.friendName = friendName;
    }

    // GET FRIENDS NAME
    public String getFriendName() {
        return friendName;
    }

    // SET FRIENDS PROFILE
    public void setFriendProfile(String friendProfile) {
        this.friendProfile = friendProfile;
    }

    // GET FRIENDS PROFILE
    public String getFriendProfile() {
        return friendProfile;
    }
}

最后是适配器类 (FriendsAdapter.java)

public class FriendsAdapter extends BaseAdapter implements Filterable {

    ProgressDialog dialog;

    Activity activity;

    LayoutInflater inflater = null;
    ImageLoader imageLoader;

    ArrayList<getFriends> arrayFriends;
    List<getFriends> mOriginalNames;

    FriendsAdapter(Activity a, ArrayList<getFriends> arrFriends) {

        activity = a;

        arrayFriends = arrFriends;

        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return arrayFriends.size();
    }

    public Object getItem(int position) {
        return arrayFriends.get(position);
    }

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

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.friends_grid_items, null);

        ImageView imgProfilePicture = (ImageView) vi.findViewById(R.id.imgProfilePicture);
        TextView txtUserName = (TextView) vi.findViewById(R.id.txtUserName);
        FrameLayout mainContainer = (FrameLayout) vi.findViewById(R.id.mainContainer);


        txtUserName.setText(arrayFriends.get(position).getFriendName());

        if (arrayFriends.get(position).getFriendProfile() != null) {
            imageLoader.DisplayImage(arrayFriends.get(position).getFriendProfile(),imgProfilePicture);
        } else if (arrayFriends.get(position).getFriendProfile() == null) {
            imgProfilePicture.setVisibility(View.GONE);
        }

        mainContainer.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent showFriendsProfile = new Intent(activity.getApplicationContext(), UserProfileNew.class);
                showFriendsProfile.putExtra("USER_ID", arrayFriends.get(position).getFriendID());
                showFriendsProfile.putExtra("NAME", arrayFriends.get(position).getFriendName());
                activity.startActivity(showFriendsProfile);
            }
        });

        return vi;
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,
                    FilterResults results) {

                arrayFriends = (ArrayList<getFriends>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                ArrayList<getFriends> FilteredArrayNames = new ArrayList<getFriends>();

                if (mOriginalNames == null) {
                    mOriginalNames = new ArrayList<getFriends>(arrayFriends);
                }
                if (constraint == null || constraint.length() == 0) {
                    results.count = mOriginalNames.size();
                    results.values = mOriginalNames;
                } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < mOriginalNames.size(); i++) {
                        getFriends dataNames = mOriginalNames.get(i);
                        if (dataNames.getFriendName().toLowerCase()
                                .contains(constraint.toString())) {
                            FilteredArrayNames.add(dataNames);
                        }
                    }

                    results.count = FilteredArrayNames.size();
                    // System.out.println(results.count);

                    results.values = FilteredArrayNames;
                    // Log.e("VALUES", results.values.toString());
                }

                return results;
            }
        };

        return filter;
    }
}

您可以在此处使用该概念并替换您的 ListView.我已经在其他地方将它用于 ListView 并且可以正常工作.不幸的是,我不能在公共论坛上公开该代码.希望这对你有帮助.同样,毫无疑问,这是一篇很长的帖子,但我认为是必要的.

You can use the concept here and substitute for your ListView. I have used this elsewhere for a ListView and works as it should. Unfortunately, I cannot give that code away on a public fora. Hope this helps you though. Again, a very lengthy post no doubt, but necessary I believe.

这篇关于列表视图的搜索功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆