使用 searchview 在搜索结果上实现 onclick

implement the onclick on the search Result using searchview

我想打开详细信息 activity,就像我在我的 recyclerview 中所做的那样,在 recyclerview 中显示搜索结果之后。由于在 Recyclerview 中更新了搜索结果,因此打开详细信息的 onclick activity 不起作用。

如何在搜索结果更新后的recyclerview中实现onclick

MainActivity.java

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, EnquiryAdapter.OnItemClickListener {

    DbHelper mDbHelper;
    public static final String FORM_ID = "form_id";
    private RecyclerView mRecyclerView;
    private EnquiryAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mDbHelper = new DbHelper(this);
 //RecyclerView Setup
        mRecyclerView = findViewById(R.id.recyclerview);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new EnquiryAdapter(MainActivity.this,mDbHelper.getFormData());
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(MainActivity.this);
   }

  @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
            SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
            searchView.setSubmitButtonEnabled(true);
            searchView.setOnQueryTextListener(new  

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String s) {
                    searchForm(s);
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String s) {
                    mRecyclerView.setAdapter(mAdapter);
                    return false;
                }
            });

            return true;
        }

    @Override
    public void onItemClick(int position) {
        Intent intent = new Intent(this,DetailedActivity.class);
        int id = EnquiryAdapter.id;
        intent.putExtra(FORM_ID,id);
        startActivity(intent);
    }


    private void searchForm(String keyword){

        SQLiteDatabase db= mDbHelper.getReadableDatabase();

        StringBuilder sb = new StringBuilder();
        sb.append("SELECT * from ").append(FormEntry.COLUMN_TABLE_NAME).append(" where ").append(FormEntry.COLUMN_NAME_NAME).append(" = ?");

        Cursor cursor = db.rawQuery(sb.toString(),new String[]{keyword});

        mRecyclerView.setAdapter(new EnquiryAdapter(MainActivity.this,cursor));

    }
}

EnquiryAdapter.java

适配器Class

public class EnquiryAdapter extends RecyclerView.Adapter<EnquiryAdapter.EnquiryViewHolder> {

    private Context context;
    private Cursor cursor;
    private OnItemClickListener mListner;
    public static int id;

    public EnquiryAdapter(Context context, Cursor cursor) {
        this.context = context;
        this.cursor = cursor;
    }

    @NonNull
    @Override
    public EnquiryViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.enquiry_list,viewGroup,false);
        return new EnquiryViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull EnquiryViewHolder enquiryViewHolder, int i) {
        if(!cursor.moveToPosition(i)){
            return;
        }

        String nameText = cursor.getString(cursor.getColumnIndex(FormContract.FormEntry.COLUMN_NAME_NAME));
        String emailText = cursor.getString(cursor.getColumnIndex(FormContract.FormEntry.COLUMN_NAME_EMAIL));
        int id = cursor.getInt(cursor.getColumnIndex(FormContract.FormEntry._ID));
        String timestamp = cursor.getString(cursor.getColumnIndex(FormContract.FormEntry.TIMESTAMP));
        Log.d("TIMESTAMP", timestamp);

        enquiryViewHolder.mNameText.setText(nameText);
        enquiryViewHolder.mEmailText.setText(emailText);
    }

    @Override
    public int getItemCount() {
        return cursor.getCount();
    }

    public class EnquiryViewHolder extends RecyclerView.ViewHolder{

        public TextView mNameText, mEmailText, mDateText;

        public EnquiryViewHolder(@NonNull View itemView) {
            super(itemView);
            mNameText = itemView.findViewById(R.id.name);
            mEmailText = itemView.findViewById(R.id.email);
            mDateText = itemView.findViewById(R.id.date_text);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mListner != null){
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){

                            cursor.moveToPosition(position);
                            id = cursor.getInt(cursor.getColumnIndex(FormContract.FormEntry._ID));
                            Log.d("ID", String.valueOf(id));
                            mListner.onItemClick(position);
                        }
                    }
                }
            });

        }
    }
    public interface OnItemClickListener{
        void onItemClick(int position);

    }
    public void setOnItemClickListener(OnItemClickListener listener){
        mListner = listener;

    }

    public void swapCursor(Cursor newCursor){
        if(cursor != null){
            cursor.close();
        }
        cursor = newCursor;

        if(newCursor != null){
            notifyDataSetChanged();
        }
    }

}

尝试将OnitemClickListener界面改成

public interface OnItemClickListener{
    void onItemClick(int id);
}

然后,在 Inquiry ViewHolder 中 itemView.onClick 只需发送 id 而不是位置,反正你不会使用它。

在您的适配器中创建接口 class。

public interface SelectedUser{

    void selectedUser(UserModel userModel);

}

在您中实现接口 activity 并覆盖 selectedUser(UserModel userModel)。

并将数据传递给您的另一个 activity

@Override
public void selectedUser(UserModel userModel) {

    startActivity(new Intent(MainActivity.this, SelectedUserActivity.class).putExtra("data",userModel));

}

在这里找到整个教程。 RecyclerView with searchview and onclicklistener