【问题标题】:Search Function didn't work搜索功能不起作用
【发布时间】:2014-05-05 18:52:44
【问题描述】:

在这里感谢您的帮助。我不知道为什么它不起作用。我添加了以下功能来搜索用户。我调试它,它似乎卡在过滤器(argo)功能上。我的代码如下。 logcat 错误中没有任何内容。感谢您的帮助。

我的代码(更新代码)

import java.util.List;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;

import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseQuery;
import com.parse.ParseRelation;
import com.parse.ParseUser;
import com.parse.SaveCallback;

public class EditFriendsActivity extends ListActivity {

    public static final String TAG = EditFriendsActivity.class.getSimpleName();

    protected ParseRelation<ParseUser> mFriendsRelation;
    protected ParseUser mCurrentUser;
    protected List<ParseUser> mUsers;
    CustomAdaptor adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.activity_edit_friends);
        // Show the Up button in the action bar.
        setupActionBar();

        getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);



    }


    @Override
    protected void onResume() {
        super.onResume();

        mCurrentUser = ParseUser.getCurrentUser();
        mFriendsRelation = mCurrentUser.getRelation(ParseConstants.KEY_FRIENDS_RELATION);

        setProgressBarIndeterminateVisibility(true);

        ParseQuery<ParseUser> query = ParseUser.getQuery();
        query.orderByAscending(ParseConstants.KEY_USERNAME);
        query.setLimit(1000);
        query.findInBackground(new FindCallback<ParseUser>() {

            @Override
            public void done(List<ParseUser> users, ParseException e) {
                setProgressBarIndeterminateVisibility(false);

                if (e == null) {
                    // Success
                    mUsers = users;
                    String[] usernames = new String[mUsers.size()];
                    int i = 0;
                    for(ParseUser user : mUsers) {
                        usernames[i] = user.getUsername();
                        i++;
                    }

                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                            EditFriendsActivity.this, 
                            android.R.layout.simple_list_item_checked,
                            usernames);
                    setListAdapter(adapter);

                    addFriendCheckmarks();
                }
                else {

                    Log.e(TAG, e.getMessage());
                    AlertDialog.Builder builder = new AlertDialog.Builder(EditFriendsActivity.this);
                    builder.setMessage(e.getMessage())
                        .setTitle(R.string.error_title)
                        .setPositiveButton(android.R.string.ok, null);
                    AlertDialog dialog = builder.create();
                    dialog.show();
                }
            }
        });
    }


    private void setupActionBar() {

        getActionBar().setDisplayHomeAsUpEnabled(true);

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.findrecipients, menu); 

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
                .getActionView();
        searchView.setSearchableInfo(searchManager
                .getSearchableInfo(getComponentName()));

        SearchView.OnQueryTextListener queryTextListener = new OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String arg0) {
                // TODO Auto-generated method stub
                android.content.Context context;
                context = getApplicationContext();
                Search srchContact = new Search(context, adapter, (ListView) mUsers);
                srchContact.Search(arg0);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String arg0) {
                // TODO Auto-generated method stub

                return true;
            }
        };
        searchView.setOnQueryTextListener(queryTextListener);
                return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public class Search
    {
        android.content.Context context;
        CustomAdaptor tempAdptr;
        CustomAdaptor adptr;
        android.widget.ListView lstContact;
        java.util.ArrayList<ParseUser> arrMyObject;
        public Search(android.content.Context con , CustomAdaptor adp , android.widget.ListView lst )
        {
            context = con;
            arrMyObject = new java.util.ArrayList<ParseUser>();
            tempAdptr = new CustomAdaptor(context, android.R.layout.simple_list_item_checked, arrMyObject);
            adptr = adp;
            lstContact = lst;
        }
        public void Search(String strSearch)
        {
            lstContact.setAdapter(tempAdptr);
            if(strSearch.equals(""))
            {
                lstContact.setAdapter(adptr);
                return ; 
            }
            arrMyObject.removeAll(arrMyObject) ; 
            for(int i = 0 ; i < mUsers.size() ; i++)
            {
                if(mUsers.get(i).getUsername().contains(strSearch)) 
                {
                    //Add item to your list
                }
            }
            tempAdptr.notifyDataSetChanged();
        }
    }


public class CustomAdaptor extends ArrayAdapter<ParseUser> {
    android.content.Context context;
    int resId;
    java.util.ArrayList<ParseUser> arrData;
    public CustomAdaptor(Context ac, int resource, java.util.ArrayList<ParseUser> data) {
        super(ac, resource, data);
        // TODO Auto-generated constructor stub
         context = ac;
            resId = resource;
            arrData = data;
    }


    @Override
    public android.view.View getView(final int position,android.view.View convertView, android.view.ViewGroup parent) 
    {
        try
        {
            ParseUser member = arrData.get(position);
            android.view.LayoutInflater inflater = (LayoutInflater) context.getSystemService(android.content.Context.LAYOUT_INFLATER_SERVICE);
            android.view.View Row =inflater.inflate(resId, parent , false);
            // Set Your XML file
            return Row;
        } 
        catch (Exception e)
        {
            return null;
        }
    }
}   

【问题讨论】:

    标签: android search searchview


    【解决方案1】:

    我有类似的代码很有用:
    在这段代码中,我们有几个类:
    第一:在列表中搜索并在列表视图中显示结果的搜索类
    第二:准备列表视图的CustomAdapter
    三:在 Search 类中调用 Search 函数的 Main

    public class Search
    {
        android.content.Context context;
        CustomAdaptor tempAdptr;
        CustomAdaptor adptr;
        android.widget.ListView lstContact;
        java.util.ArrayList<MyObject> arrMyObject;
        public SearchContact(android.content.Context con , CustomAdaptor adp , android.widget.ListView lst )
        {
            context = con;
            arrMyObject = new java.util.ArrayList<MyObject>();
            tempAdptr = new CustomAdaptor(context, R.layout.contact_row, arrMyObject);
            adptr = adp;
            lstContact = lst;
        }
        public void Search(String strSearch)
        {
            lstContact.setAdapter(tempAdptr);
            if(strSearch.equals(""))
            {
                lstContact.setAdapter(adptr);
                return ; 
            }
            arrMyObject.removeAll(arrMyObject) ; 
            for(int i = 0 ; i < MainActivity.GetArrMyObject().size() ; i++)
            {
                if(arrlist.get(i).contains(strSearch)) 
                {
                    //Add item to your list
                }
            }
            tempAdptr.notifyDataSetChanged();
        }
    }
    
    
    //------------------------------------------------------------------------------------
    public class CustomAdaptor extends ArrayAdapter<MyObject> {
    
    android.content.Context context;
    int resId;
    java.util.ArrayList<MyObject> arrData;
    public ContactAdaptor(android.content.Context ac, int resource , java.util.ArrayList<MyObject> data ) {
        super(ac, resource, data);
        context = ac;
        resId = resource;
        arrData = data;
    }
    @Override
    public android.view.View getView(final int position,android.view.View convertView, android.view.ViewGroup parent) 
    {
        try
        {
            MyObject member = arrData.get(position);
            android.view.LayoutInflater inflater = (LayoutInflater) context.getSystemService(android.content.Context.LAYOUT_INFLATER_SERVICE);
            android.view.View Row =inflater.inflate(resId, parent , false);
            // Set Your XML file
            return Row;
        } 
        catch (Exception e)
        {
            return null;
        }
    }
    }
    


    现在您可以在 main 中使用此代码:

    SearchContact srchContact = new SearchContact(context, adptr, arraylist);
        srchContact.Search(YourObject);
    

    【讨论】:

    • 感谢您的帮助。我已经尝试过您的方法,但现在搜索时似乎没有错误,但它没有根据我输入的内容过滤搜索。我在上面更新了应付,你会帮我检查我做错了什么吗?非常感谢。抱歉,我是新手,非常感谢您的指导。
    • 你想过滤什么?
      解释你的项目!!
    • 我正在尝试过滤从 Parse 检索到的用户。感谢你的帮助。谢谢。
    • 搜索功能中的任何过滤器都可以在其中完成。当您从列表中读取一个项目时,您可以将其放入一个新对象中并检查您的过滤器选项。如果需要,您可以将该对象添加到 arraylist
    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2015-02-27
    相关资源
    最近更新 更多