0

我已經實現了一個Recycler視圖,其中的項目單擊Holder類內。每個項目點擊打開一個新的活動。問題在於,當用戶點擊兩次快速點擊(非常快的時間)時,它會打開兩次活動。如何防止Recycler視圖項執行兩次相同的任務

我不能嘗試以下解決方案:

  1. android:launchMode="singleInstance"因爲我使用 startActivityForResult()調用新的活動。
  2. android:launchMode="singleTask"也不起作用。

如何停止發生?請建議。

下面是我的適配器類:

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

      RecyclerView.ViewHolder viewHolder = null; 

      LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

      switch (viewType) { 

       case MY_VIEW_TYPE: 

        View v1 = inflater.inflate(R.layout.created_by_me_item, parent, false); 

        viewHolder = new ViewHolderCreatedByMe(v1); 

        break;  

      } 
      return viewHolder; 
     } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

     if (holder instanceof ViewHolderCreatedByMe) { 
      // The data setting method is inside the Holder class 
      ((ViewHolderCreatedByMe) holder).setDataCreatedByMe(mFeedRecordListData.get(position)); 

     } else { 

      ((ViewHolderFooter) holder).setFooterView(); 
     } 
    } 

而下面是我的holder類:

public class ViewHolderCreatedByMe extends RecyclerView.ViewHolder implements View.OnClickListener { 

    // ... some class members are declared here 


    public ViewHolderCreatedByMe(View itemView) { 

     super(itemView); 
     // a few more UI components are initialized here 

     rl_reaction_item_main_layout = (RelativeLayout) itemView.findViewById(R.id.rl_reaction_item_main_layout); 

     rl_reaction_item_main_layout.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 

      case R.id.rl_reaction_item_main_layout: 

       Intent intent = new Intent(mActivity, NewActivity.class); 

       intent.putExtra(NewActivity.KEY_EVENT_ID, UIModel.getEventID()); 

       intent.putExtra(NewActivity.KEY_EVENT_TIME_STAMP, UIModel.getEventLocalTimeStamp()); 

       intent.putExtra(NewActivity.KEY_EVENT_POSITION, getAdapterPosition()); 

       mFragment.startActivityForResult(intent, Constants.REQUEST_CODE); 

       break; 
     } 
    } 
+0

共享代碼,你在哪裏與適配器代碼一起開始新的活動。 –

+0

向我們顯示您的適配器代碼。 –

+0

@AlokOmkar請檢查添加的代碼。謝謝。 – SKP

回答

0

你應該使用一個布爾標誌來檢查的天氣列項被點擊或不喜歡這樣。

boolean isItemClicked = false;

private void onRecyclerViewItemClick() 
{ 
    if(!isItemClicked) 
    { 
     isItemClicked = true; 
     startActivity(new Intent(this, MyActivity.class)); 
    } 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    isItemClicked = false; 
} 

*注意 - 我使用的名稱onRecyclerViewItemClick()例如在這裏,它會與您的ListView的onItemClick

+0

這種布爾方式肯定會起作用,但我正在尋找其他方式來做到這一點。如果我沒有得到其他的決議,那麼我會走你的路。謝謝:) – SKP

+0

只需添加此行當您開始您的活動 ** intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); ** 它肯定會工作。 –

0

創建攔截點擊您recyclerview項目的視圖界面所取代。

例如:

public class ViewHolderCreatedByMe extends RecyclerView.ViewHolder implements View.OnClickListener { 
    // ... some class members are declared here 
    public ViewHolderCreatedByMe(View itemView) { 
     super(itemView); 
     // a few more UI components are initialized here 
     rl_reaction_item_main_layout = (RelativeLayout) itemView.findViewById(R.id.rl_reaction_item_main_layout); 
     rl_reaction_item_main_layout.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     int position = getAdapterPosition(); 
     if(position != RecyclerView.NO_POSITION && mCustomClickListener != null) { 
      mCustomClickListener.onClick(UIModel, position); 
     } 
    } 

在:

private CustomClickListener mCustomClickListener; 
public void setClickListener(CustomClickListener customClickListener) { 
    this.mCustomClickListener = customClickListener; 
} 

修改您的視圖holder類這樣:

public interface CustomClickListener { 
    void onClick(UIModel uiModel, int position); 
} 

在適配器類設置定義的接口創建方法你的片段類,你可以定義你的適配器,在這裏設置點擊監聽器:

CustomClickListener customClickListener = new CustomClickListener() { 
    @Override 
    void onClick(UIModel uiModel, int position) { 

     Intent intent = new Intent(getActivity(), NewActivity.class); 
     intent.putExtra(NewActivity.KEY_EVENT_ID, uiModel.getEventID()); 
     intent.putExtra(NewActivity.KEY_EVENT_TIME_STAMP, uiModel.getEventLocalTimeStamp()); 
     intent.putExtra(NewActivity.KEY_EVENT_POSITION, position); 
     getActivity().startActivityForResult(intent, Constants.REQUEST_CODE); 
     adapter.setCustomClickListener(null); //To prevent the event being triggered twice 

    } 
} 
adapter.setCustomClickListener(customClickListener); 

在你的片段,你必須重寫onActivityResult,這樣做:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if(requestCode == Constants.REQUEST_CODE) { 
     //Do something with the result 
     adapter.setCustomClickListener(customClickListener); // Make customClickListener a global variable 
    } 
} 

希望這有助於。如果您找到了解決問題的更好方法,請告訴我,如果這不符合您的需求。基於布爾值的答案會起作用,但是當您打開和關閉應用程序時,它的亂碼會跟蹤布爾值。

0

添加這些標誌Intent.FLAG_ACTIVITY_SINGLE_TOPFLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_RESET_TASK_IF_NEEDEDFLAG_ACTIVITY_CLEAR_TOP

點擊事件應該是這樣的

case R.id.rl_reaction_item_main_layout: 

        Intent intent = new Intent(mActivity, NewActivity.class); 

        intent.putExtra(NewActivity.KEY_EVENT_ID, UIModel.getEventID()); 

        intent.putExtra(NewActivity.KEY_EVENT_TIME_STAMP, UIModel.getEventLocalTimeStamp()); 

        intent.putExtra(NewActivity.KEY_EVENT_POSITION, getAdapterPosition()); 
        //add these following line 
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

        mFragment.startActivityForResult(intent, Constants.REQUEST_CODE); 

        break; 
+0

此解決方案不工作:( – SKP

+0

@SKP奇怪的是,一旦我面臨同樣的問題,以這種方式解決。順便說一句,我已經編輯了我的答案,沒有具體的只是添加更多的附加標誌,請嘗試並讓我知道 –

+0

您可能不會調用** startActivity(intent)**而不是** startActivityForResult()**我的問題是我必須調用** startActivityForResult()**。 – SKP

相關問題