【问题标题】:implement the onclick on the search Result using searchview使用 searchview 实现对搜索结果的 onclick
【发布时间】:2019-03-31 09:50:22
【问题描述】:

我想在 recyclerview 中显示搜索结果之后打开我在 recyclerview 中所做的详细活动。由于 Recyclerview 中的搜索结果更新,onclick 以打开详细信息活动不起作用。

如何在recyclerview中实现onclick在搜索Result后更新

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

适配器类

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();
        }
    }

}

【问题讨论】:

  • 我从未实现过 Filterable 类
  • 您能在id = cursor.getInt(cursor.getColumnIndex(FormContract.FormEntry._ID)); 中检索项目ID 吗?
  • 是的,我从 @ronginat 那里得到了 id

标签: android android-recyclerview android-sqlite android-search


【解决方案1】:

尝试将OnitemClickListener接口更改为

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

然后,在 EnquiryViewHolder itemView.onClick 中只发送 id 而不是位置,反正你没有使用它。

【讨论】:

  • 很好,但是在recyclerview更新时搜索后,onclick对那个item不起作用..
  • 尽量不要在每个onQueryTextSubmit 中实例化一个新的EnquiryAdapter。相反,请使用您的方法swapCursor
  • mAdapter.swapCursor(cursor);替换mRecyclerView.setAdapter(new EnquiryAdapter(MainActivity.this,cursor));
  • Onclick 开始工作,但是,当单击 searchview 后退按钮停止工作时,列表恢复。现在没有显示整个列表。
  • “当searchview后退按钮停止工作时列表恢复”是什么意思...?
【解决方案2】:

在您的适配器类中创建一个接口。

public interface SelectedUser{

    void selectedUser(UserModel userModel);

}

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

并将数据传递给您的其他活动

@Override
public void selectedUser(UserModel userModel) {

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

}

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

【讨论】:

  • 我支付了你的源代码却一无所获
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2016-12-11
相关资源
最近更新 更多