提问者:小点点

如何使用卡片将search chBar添加到RecyclView


我从JSON数组中获取数据,并在RecyclerView上显示它。我想实现一个搜索栏,搜索并显示RecyclerView中的元素。

我的回收器适配器.java

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.CustomViewHolder> {
private List<FeedItem> feedItemList;
private Context mContext;

public MyRecyclerAdapter(Context context, List<FeedItem> feedItemList) {
    this.feedItemList = feedItemList;
    this.mContext = context;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);

    CustomViewHolder viewHolder = new CustomViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
    FeedItem feedItem = feedItemList.get(i);



    //Setting text view title
    customViewHolder.textView.setText(Html.fromHtml(feedItem.getTitle()));
    customViewHolder.contactTV.setText(Html.fromHtml(feedItem.getContact()));
    customViewHolder.emailTV.setText(Html.fromHtml(feedItem.getEmail()));
    customViewHolder.eventname.setText(Html.fromHtml(feedItem.getEventname()));
    customViewHolder.collegename.setText(Html.fromHtml(feedItem.getCollegename()));

    //Handle click event on both title and image click
    customViewHolder.textView.setOnClickListener(clickListener);

    customViewHolder.textView.setTag(customViewHolder);

    // Set the view to fade in
    //setFadeAnimation(customViewHolder.itemView);

}

/*private void setFadeAnimation(View view) {
    AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
    anim.setDuration(800);
    view.startAnimation(anim);
}*/

View.OnClickListener clickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        CustomViewHolder holder = (CustomViewHolder) view.getTag();
        int position = holder.getPosition();

        FeedItem feedItem = feedItemList.get(position);
        Toast.makeText(mContext, feedItem.getTitle(), Toast.LENGTH_SHORT).show();
    }
};

@Override
public int getItemCount() {
    return (null != feedItemList ? feedItemList.size() : 0);
}
public class CustomViewHolder extends RecyclerView.ViewHolder
{
    protected TextView textView ,contactTV, emailTV, collegename, eventname;
    protected ImageView callIcon, mailIcon, eventIcon;

    public CustomViewHolder(View view)
    {
        super(view);
        this.textView = (TextView) view.findViewById(R.id.title);
        this.contactTV = (TextView) view.findViewById(R.id.contactTV);
        this.emailTV = (TextView) view.findViewById(R.id.emailTV);
        this.eventname = (TextView) view.findViewById(R.id.eventname);
        this.collegename = (TextView) view.findViewById(R.id.collegename);

        this.callIcon = (ImageView) view.findViewById(R.id.callIcon);
        this.mailIcon = (ImageView) view.findViewById(R.id.mailIcon);
        this.eventIcon = (ImageView) view.findViewById(R.id.eventIcon);
    }
}
}

AdminActivity.java

public class AdminActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {

private static final String TAG = "userList";
private List<FeedItem> feedsList;
private RecyclerView mRecyclerView;
private MyRecyclerAdapter adapter;
private ProgressBar progressBar;
private TextView ParticipantsCounts;
int count=0;
private int number;

private SwipeRefreshLayout swipeRefreshLayout;

private final String url="http://bmcctroika.hol.es/get-data.php";;

private int offSet = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {

    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setDisplayShowHomeEnabled(true);


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_admin);
    // Initialize recycler view
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

    progressBar = (ProgressBar) findViewById(R.id.progress_bar);
    progressBar.setVisibility(View.VISIBLE);

    ParticipantsCounts= (TextView) findViewById(R.id.ParticipantsCount);

    // Downloading data from below url
    new AsyncHttpTask().execute(url);
    new AsyncHttpRecordTask().execute(url);
    swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);

    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refreshitems();
        }
    });
}

private void refreshitems()
{
    new AsyncHttpTask().execute(url);
    new AsyncHttpRecordTask().execute(url);
}

@Override
public void onRefresh()
{
    new AsyncHttpTask().execute(url);
    new AsyncHttpRecordTask().execute(url);
}

public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected void onPreExecute() {
        setProgressBarIndeterminateVisibility(true);
    }

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP OK
            if (statusCode == 200)
            {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null)
                {
                    response.append(line);
                }
                parseResult(response.toString());
                result = 1; // Successful

            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }
        return result; //"Failed to fetch data!";
    }

    @Override
    protected void onPostExecute(Integer result)
    {
        // Download complete.
        progressBar.setVisibility(View.GONE);
        if (result == 1)
        {
            adapter = new MyRecyclerAdapter(AdminActivity.this, feedsList);
            mRecyclerView.setAdapter(adapter);
        } else
        {
            Toast.makeText(AdminActivity.this, "Failed to fetch data!", Toast.LENGTH_SHORT).show();
        }
        swipeRefreshLayout.setRefreshing(false);
    }
}

private void parseResult(String result)
{
    try
    {
        JSONObject response = new JSONObject(result);
        JSONArray posts = response.optJSONArray("result");
        feedsList = new ArrayList<>();
        for (int i = 0; i < posts.length(); i++)
        {
            JSONObject post = posts.optJSONObject(i);
            FeedItem item = new FeedItem();
            item.setTitle(post.optString("fullname"));
            item.setContact(post.optString("contactno"));
            item.setEmail(post.optString("emailaddress"));
            item.setEventname(post.optString("eventname"));
            item.setCollegename(post.optString("collegename"));
            feedsList.add(item);
        }
        //ParticipantsCounts.setText(String.valueOf(posts.length()));
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
}
public class AsyncHttpRecordTask extends AsyncTask<String, Void, Integer> {


    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP OK
            if (statusCode == 200)
            {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null)
                {
                    response.append(line);
                }
                parseResultnum(response.toString());
                result = 1; // Successful

            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }
        return result; //"Failed to fetch data!";
    }
}

private void parseResultnum(String result)
{
    try
    {
        JSONObject response = new JSONObject(result);
        JSONArray posts = response.optJSONArray("result");
        ParticipantsCounts.setText("No. of Participants : "+String.valueOf(posts.length()));
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
}
}

共3个答案

匿名用户

您可以使用actionView(示例)轻松地将SearchView作为菜单项添加到您的ActionBar。然后基于SearchView. OnQueryTextListener,您将能够将搜索查询应用到您的适配器。到底是什么阻止了你走这条路?

匿名用户

试试这个代码

1)主活动.类

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "userList";
    private RecyclerView mRecyclerView;
    private MyRecyclerAdapter adapter;
    private TextView ParticipantsCounts;
    private ArrayList<HashMap<String, String>> list;
    private HashMap<String, String> listsub;
    private Context context;
    private SwipeRefreshLayout swipeRefreshLayout;

    private final String urlmain = "http://bmcctroika.hol.es/get-data.php";
    private ProgressDialog pDialog;
    private Integer result = 0;
    private HttpURLConnection urlConnection;
    private URL url;
    private int statusCode;
    private StringBuilder response;
    private BufferedReader r;
    private String line;
    private JSONArray posts;
    private SearchView search;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        context = MainActivity.this;

        search = (SearchView) findViewById(R.id.search);

        // Initialize recycler view
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        ParticipantsCounts = (TextView) findViewById(R.id.ParticipantsCount);

        // Downloading data from below url
        new AsyncHttpTask().execute(urlmain);

        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshitems();
                swipeRefreshLayout.setRefreshing(false);
            }
        });
    }

    private void refreshitems() {

        new AsyncHttpTask().execute(urlmain);
    }

    public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {

        @Override
        protected void onPreExecute() {

            pDialog = new ProgressDialog(context);
            pDialog.setMessage("Please wait");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Integer doInBackground(String... params) {

            data1(params);

            return result; //"Failed to fetch data!";
        }

        @Override
        protected void onPostExecute(Integer result) {

            pDialog.dismiss();

            // Download complete.
            if (result == 1) {

                ParticipantsCounts.setText("No. of Participants : " + String.valueOf(posts.length()));

                if (list.size() > 0) {
                    mRecyclerView.setLayoutManager(new LinearLayoutManager(mRecyclerView.getContext()));
                    adapter = new MyRecyclerAdapter(mRecyclerView.getContext(), list);
                    mRecyclerView.setAdapter(adapter);

                    search.setOnQueryTextListener(listener);

                } else {
                    Toast.makeText(context, "No list found!", Toast.LENGTH_SHORT).show();

                }
            } else {
                Toast.makeText(context, "Failed to fetch data!", Toast.LENGTH_SHORT).show();
            }
        }
    }

    SearchView.OnQueryTextListener listener = new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            query = query.toLowerCase();

            final ArrayList<HashMap<String, String>> filteredList = new ArrayList<>();

            for (int i = 0; i < list.size(); i++) {

                final String text = list.get(i).toString().toLowerCase();
                if (text.contains(query)) {

                    filteredList.add(list.get(i));
                }
            }

            mRecyclerView.setLayoutManager(new LinearLayoutManager(mRecyclerView.getContext()));
            adapter = new MyRecyclerAdapter(mRecyclerView.getContext(), filteredList);
            mRecyclerView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            return true;
        }
    };


    private void data1(String... params) {

        try {
            url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                response = new StringBuilder();

                while ((line = r.readLine()) != null) {
                    response.append(line);
                }

                parseResult(response.toString());
                result = 1; // Successful

            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }
    }


    private void parseResult(String result) {
        try {
            JSONObject response = new JSONObject(result);
            posts = response.optJSONArray("result");
            list = new ArrayList<>();
            Log.e("posts", "posts" + posts.length());
            for (int i = 0; i < posts.length(); i++) {
                JSONObject post = posts.optJSONObject(i);
                listsub = new HashMap<>();
                listsub.put("fullname", post.optString("fullname"));
                listsub.put("contactno", post.optString("contactno"));
                listsub.put("emailaddress", post.optString("emailaddress"));
                listsub.put("eventname", post.optString("eventname"));
                listsub.put("collegename", post.optString("collegename"));
                list.add(listsub);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

2) activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <SearchView
        android:id="@+id/search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginTop="10dp"
        android:background="@android:color/holo_blue_dark"
        android:hint="Search here"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:textColor="@android:color/black"
        android:textColorHint="@android:color/black"
        android:textSize="15dp" />

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_margin="10dp">

            <TextView
                android:id="@+id/ParticipantsCount"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@android:color/black"
                android:textSize="15dp" />

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            </android.support.v7.widget.RecyclerView>
        </LinearLayout>
    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

3) 我的回收适配器类

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {

    private ArrayList<HashMap<String, String>> list;
    private HashMap<String, String> listsub;
    private Context mContext;
    View view;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;

        public TextView textView, contactTV, emailTV, collegename, eventname;


        public ViewHolder(View view) {
            super(view);

            mView = view;

            this.textView = (TextView) view.findViewById(R.id.title);
            this.contactTV = (TextView) view.findViewById(R.id.contactTV);
            this.emailTV = (TextView) view.findViewById(R.id.emailTV);
            this.eventname = (TextView) view.findViewById(R.id.eventname);
            this.collegename = (TextView) view.findViewById(R.id.collegename);

        }
    }

    public MyRecyclerAdapter(Context context, ArrayList<HashMap<String, String>> feedItemList) {
        list = feedItemList;
        this.mContext = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_row, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int postion) {


        listsub = list.get(postion);

        //Setting text view title
        holder.textView.setText(listsub.get("fullname"));
        holder.contactTV.setText(listsub.get("contactno"));
        holder.emailTV.setText(listsub.get("emailaddress"));
        holder.eventname.setText(listsub.get("eventname"));
        holder.collegename.setText(listsub.get("collegename"));

    }


    @Override
    public int getItemCount() {
        return list.size();
    }

}

4) list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/title"
        android:textSize="13dp"
        android:textColor="@android:color/black" />

       <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/contactTV"
        android:textSize="13dp"
        android:textColor="@android:color/black" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/emailTV"
        android:textSize="13dp"
        android:textColor="@android:color/black" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/eventname"
        android:textSize="13dp"
        android:textColor="@android:color/black" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/collegename"
        android:textSize="13dp"
        android:textColor="@android:color/black" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/black" />

</LinearLayout>

匿名用户

这正是您想要的,这是一个完整的搜索和回收视图示例

private RecyclerView mRecyclerView;
private ExampleAdapter mAdapter;
private List<ExampleModel> mModels;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_main, container, false);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);

    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setHasOptionsMenu(true);

    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    mModels = new ArrayList<>();

    for (String movie : MOVIES) {
        mModels.add(new ExampleModel(movie));
    }

    mAdapter = new ExampleAdapter(getActivity(), mModels);
    mRecyclerView.setAdapter(mAdapter);
}

有关更多信息,请参阅此Searchable RecyclerView演示