0

私のアプリではがToolbarにあります。SearchViewはLongClickアクションの後にフィルタリングを停止します

ユーザーが検索アイコンをクリックすると、SearchViewが展開され、ユーザーが入力を開始します。検索クエリはタイトルでRecyclerViewのリストをフィルタリングします。これはすべて正常に動作します。

ただし、RecyclerViewアイテムのいずれかでOnLongClickアクションを実行すると、フィルタ機能が機能しなくなります。

私は、各RecyclerViewホルダーに取り付けたOnClickListenerとOnLongClickListenerの両方を持っているが、それはフィルタリングからSearchViewを止めるだけOnLongClickアクションです。なぜか分からない。私はSearchViewを元に戻して、RecyclerViewを無駄にリセットしようとしました。 SearchViewには影響しません

機能スペースのために削除されています。

は、ここに私のコードです。

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    //LONG CLICK ACTION MODE VARIABLES 
    boolean isInActionMode = false; 
    TextView selectedCounterText; 

    //SEARCH BAR 
    SearchView searchView; 

    //INSERT DIALOG TEXTVIEWS 
    EditText editTitle, editCategory, editSignifier, editDate, editRecurs, editDetails; 
    Button btnCreate, btnCancel; 

    RecyclerView recyclerView; 
    RecyclerView.LayoutManager layoutManager; 
    CardAdapter adapter; 
    Toolbar toolbar; 

    ArrayList<Bullet> bullets = new ArrayList<>(); 
    ArrayList<Bullet> selectedBullets = new ArrayList<>(); 
    int counter = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     //SET DEFAULT VIEW STATES 
     selectedCounterText = (TextView) findViewById(R.id.selected_counter); 
     appName = (TextView) findViewById(R.id.app_name); 
     selectedCounterText.setVisibility(View.GONE); 
     appName.setVisibility(View.VISIBLE); 
     noBulletsMessage = (TextView) findViewById(R.id.noBullets_message); 
     noBulletsMessage.setVisibility(View.GONE); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     //RECYCLERVIEW PROPERTIES 
     recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setHasFixedSize(true); 

     //ACTION MODE ON LONG CLICK VIEW STATES 
     selectedCounterText = (TextView) findViewById(R.id.selected_counter); 
     selectedCounterText.setVisibility(View.GONE); 

     //ADAPTER 
     adapter = new CardAdapter(this, bullets); 

     //RETRIEVE DATA 
     retrieveData(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_activity_main, menu); 

     //SEARCH 
     final MenuItem searchItem = menu.findItem(R.id.item_search); 
     searchView = (SearchView) searchItem.getActionView(); 
     searchView.setIconifiedByDefault(true); 
     searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
      @Override 
      public boolean onClose() { 
       return false; 
      } 
     }); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String query) { 
       //FILTER AS YOU TYPE 
       adapter.getFilter().filter(query); 
       return false; 
      } 
     }); 

     return true; 
    } 

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

    /** 
    * @param item 
    * @return This method includes behavior for all action toolbar menu items: Add, search, edit, 
    * and delete. 
    * <p> 
    * It detects which button is pressed and performs the appropriate action. 
    */ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

      //IF HOME (BACK ARROW) IS PRESSED 
     } else if (item.getItemId() == android.R.id.home) { 
      clearActionMode(); 
      adapter.notifyDataSetChanged(); 
     } 

     return true; 
    } 

    public void clearActionMode() { 
     isInActionMode = false; 
     toolbar.getMenu().clear(); 
     toolbar.inflateMenu(R.menu.menu_activity_main); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
     selectedCounterText.setVisibility(View.GONE); 
     appName.setVisibility(View.VISIBLE); 
     selectedCounterText.setText("0 Item(s) Selected"); 
     counter = 0; 
     selectedBullets.clear(); 
    } 

    @Override 
    public void onBackPressed() { 
     if (isInActionMode) { 
      clearActionMode(); 
      adapter.notifyDataSetChanged(); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
} 

CardHolder.java

public CardHolder(final View itemView, final MainActivity mainActivity) { 
     super(itemView); 
     signifier_img = (ImageView) itemView.findViewById(R.id.img_id); 
     titleText = (TextView) itemView.findViewById(R.id.title); 
     categoryText = (TextView) itemView.findViewById(R.id.category); 
     cardView = (CardView) itemView.findViewById(R.id.bulletCardView); 
     checkBox = (CheckBox) itemView.findViewById(R.id.check_list_item); 
     this.mainActivity = mainActivity; 

     //CLICK LISTENERS 
     cardView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       mainActivity.toolbar.getMenu().clear(); 
       mainActivity.toolbar.inflateMenu(R.menu.menu_action_mode); 
       mainActivity.selectedCounterText.setVisibility(View.VISIBLE); 
       mainActivity.appName.setVisibility(View.GONE); 
       mainActivity.isInActionMode = true; 
       mainActivity.adapter.notifyDataSetChanged(); 
       mainActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

       return true; 
      } 
     }); 
     cardView.setOnClickListener(this); 
     checkBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mainActivity.prepareSelection(view, getAdapterPosition()); 
      } 
     }); 

    } 

    @Override 
    public void onClick(View view) { 
     this.itemClickListener.onItemClick(view, getLayoutPosition()); 
    } 

    public void setItemClickListener(ItemClickListener itemClick) { 
     this.itemClickListener = itemClick; 
    } 
} 

CardAdapter.java

public class CardAdapter extends RecyclerView.Adapter<CardHolder> implements Filterable { 

    Context context; 
    ArrayList<Bullet> bullets, filterList; 
    SearchFilter filter; 
    MainActivity mainActivity; 

    public CardAdapter(Context context, ArrayList<Bullet> bullets) { 
     this.context = context; 
     this.bullets = bullets; 
     this.filterList = bullets; 
     mainActivity = (MainActivity) context; 
    } 

    //INITIALIZE VIEWHOLDER 
    @Override 
    public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     //VIEW OBJ FROM XML 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_card_view, parent, false); 

     //HOLDER 
     CardHolder holder = new CardHolder(view, mainActivity); 

     return holder; 
    } 

    //BIND DATA TO VIEWS 
    @Override 
    public void onBindViewHolder(final CardHolder holder, int position) { 
     holder.signifier_img.setImageResource(R.drawable.asterisk_48px); 
     holder.titleText.setText(bullets.get(position).getTitle()); 

     if (!mainActivity.isInActionMode) { 
      holder.checkBox.setVisibility(View.GONE); 
     } else { 
      holder.checkBox.setVisibility(View.VISIBLE); 
      holder.checkBox.setChecked(false); 
     } 

     //CARD CLICKED 
     holder.setItemClickListener(new ItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       //DISPLAY POPUP OF FULL INFO OF BULLET 
       //OPEN DETAIL VIEW 
       //PASS DATA TO VIEW 

       if (!mainActivity.isInActionMode) { 
        //CREATE INTENT 
        Intent intent = new Intent(context, DetailView.class); 

        //LOAD DATA TO INTENT 
        intent.putExtra("ID", bullets.get(position).getId()); 
        intent.putExtra("TITLE", bullets.get(position).getTitle()); 
        intent.putExtra("CATEGORY", bullets.get(position).getCategory()); 
        intent.putExtra("SIGNIFIER", bullets.get(position).getSignifier()); 
        intent.putExtra("DATE", bullets.get(position).getDate()); 
        intent.putExtra("RECURS", bullets.get(position).getRecurs()); 
        intent.putExtra("DETAILS", bullets.get(position).getDetails()); 

        //START ACTIVITY 
        context.startActivity(intent); 
       } else { 
        //DO NOTHING 
       } 
      } 
     }); 
    } 

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

    //RETURN FILTER OBJ 
    @Override 
    public Filter getFilter() { 
     if (filter == null) { 
      filter = new SearchFilter(filterList, this); 
     } 

     return filter; 
    } 
} 

SearchFilter.java

public class SearchFilter extends Filter { 

    CardAdapter adapter; 
    ArrayList<Bullet> filterList; 

    public SearchFilter(ArrayList<Bullet> filterList, CardAdapter adapter) { 
     this.adapter = adapter; 
     this.filterList = filterList; 
    } 

    //FILTER OCCURS HERE 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     FilterResults results = new FilterResults(); 

     //CHECK CONSTRAINT VALIDITY 
     if (constraint != null && constraint.length() > 0) { 

      //CHANGE TO UPPER 
      constraint = constraint.toString().toUpperCase(); 

      //STORE FILTERED BULLETS 
      ArrayList<Bullet> filteredBullets = new ArrayList<>(); 

      for (int i = 0; i < filterList.size(); i++) { 
       //CHECK 
       if (filterList.get(i).getTitle().toUpperCase().contains(constraint)) { 
        //ADD BULLET TO FILTERED BULLETS 
        filteredBullets.add(filterList.get(i)); 
       } 
      } 

      results.count = filteredBullets.size(); 
      results.values = filteredBullets; 

     } else { 
      results.count = filterList.size(); 
      results.values = filterList; 
     } 

     return results; 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     adapter.bullets = (ArrayList<Bullet>) results.values; 

     //REFRESH RECYCLERVIEW 
     adapter.notifyDataSetChanged(); 
    } 
} 

menu_activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <item 
     android:id="@+id/item_search" 
     android:icon="@drawable/ic_action_search" 
     android:title="Search..." 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="collapseActionView|ifRoom" /> 

    <item 
     android:id="@+id/item_add" 
     android:icon="@drawable/ic_action_add2" 
     android:title="Add" 
     app:showAsAction="always" /> 

</menu> 

私はそれに影響を与えるすべてのコードだと信じていますが、何か他のものがあります場合は、私に知らせなければなりません。

はここでスタックトレースです:

私は実際にそれが何を意味するのか理解していないが、それは私がLongClickイベント後、いくつかのクエリをフィルタ処理しようとするときに発生するものです。

9月7日01:46:38.184 17027から17104/com.curtiswhite.www.sqlitedatabaseforephemeris I/OpenGLRenderer:初期化EGL、バージョン1.4 9月7日01:47:40.066 17027から17027/com.curtiswhite .www.sqlitedatabaseforephemeris E/SpannableStringBuilderは:47:40.066は17027から17027/com.curtiswhite.www.sqlitedatabaseforephemeris Eは/ SpannableStringBuilder:SPAN_EXCLUSIVE_EXCLUSIVEスパンがゼロ長 09から07を持つことができないSPAN_EXCLUSIVE_EXCLUSIVEスパンはゼロ長 09から07 01を持つことができません01:47:45.036 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris E/SpannableStringBuilder:SPAN_EXCLUSIVE_EXCLUSIVEスパンの長さはゼロではありません 09-07 01:47:45.036 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris E/S pannableStringBuilder:SPAN_EXCLUSIVE_EXCLUSIVEスパンの長さはゼロではありません 09-07 01:47:45.991 17027-17027/com.curtiswhite.wwwsqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのbeginBatchEdit 09-07 01:47:45.991 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのgetSelectedText 09-07 01:47:46.0​​03 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのendBatchEdit 09-07 01:47:46.0​​03 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブInputConnectionのgetTextBeforeCursor 09-07 01:47 :46.0​​15 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのgetTextAfterCursor 09-07 01:47:46.0​​22 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputCのbeginBatchEdit on connect 09:01:47:46.0​​23 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブInputConnectionのgetSelectedText/IInputConnectionWrapper:非アクティブなInputConnectionのendBatchEdit 09-07 01:47:46.0​​23 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブInputConnectionのgetTextBeforeCursor 09-07 01:47:46.0​​24 17027-17027/com。 W/IInputConnectionWrapper:非アクティブなInputConnectionのgetTextAfterCursor 09-07 01:47:46.0​​27 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのbeginBatchEdit 09-07 01:47:46.0​​27 17027-17027/com.curtiswhi te.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのgetSelectedText 09-07 01:47:46.0​​27 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブInputConnectionのendBatchEdit 09-07 01:47:46.0​​28 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのgetTextBeforeCursor 09-07 01:47:46.0​​30 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブInputConnectionのgetTextAfterCursor 09- 07 01:47:46.0​​62 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブなInputConnectionのbeginBatchEdit 09-07 01:47:46.0​​62 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:getSelectedText不活性時e InputConnection 09:01:47:46.0​​62 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブInputConnectionのendBatchEdit 09-07 01:47:46.0​​63 17027-17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:非アクティブInputConnection上getTextBeforeCursor 9月7日01:47:46.0​​63 17027から17027/com.curtiswhite.www.sqlitedatabaseforephemeris W/IInputConnectionWrapper:getTextAfterCursor非アクティブInputConnection上

答えて

1

私は問題を解決しました。

この問題は、新しいメニューを「LONGClick」に展開したときに発生したことが判明しました。これにより、SearchViewが(予想どおり)収縮しましたが、押し戻すと(OnBackPressedが呼び出されると)元のメニューは膨張しますが、そこに配置されたSearchViewはインスタンス化されていない新しいものでした。

これを修正するには、単にOnCreateMenuOptions(toolbar.getMenu())を呼び出します。 onBackPressedメソッドで宣言します。これはSearchViewを元に戻すので、メニューが膨張した後に再び機能します。

+0

あなたは神amzaingです....共有ありがとう –

関連する問題