2016-08-01 13 views
0

私のRecyclerViewのアダプタファイルには、onClickListListenerがonCreateViewHolderメソッドで設定されています。これは、RecyclerViewリストのアイテムがクリックされたときに新しいアクティビティを起動することで、正しく機能しています。別のメソッドを実行するアイテムにLongClickのOnLongClickListenerを追加しようとしています。RecyclerViewアダプタ:なぜonLongClickメソッドはonClickと競合しますか?

以下に示すsetOnLongClickListenerセクションとonLongClickメソッドを追加すると、RecyclerViewリストのアイテムが正しく表示されないため、ビューのあるものが正しくない必要があります。私はここで何が欠けていますか?

アダプタファイル:

public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.ContactHolder>{ 

    private RecyclerItemClickListener recyclerItemClickListener; 
    ... 
    @Override 
    public ContactHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false); 

    final ContactHolder contactHolder = new ContactHolder(view); 

    contactHolder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int adapterPos = contactHolder.getAdapterPosition(); 
      if (adapterPos != RecyclerView.NO_POSITION) { 
       if (recyclerItemClickListener != null) { 
        recyclerItemClickListener.onItemClick(adapterPos, contactHolder.itemView); 
       } 
      } 
     } 
    }); 

    contactHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View view) { 
      int adapterPos = contactHolder.getAdapterPosition(); 
      if (adapterPos != RecyclerView.NO_POSITION) { 
       if (recyclerItemClickListener != null) { 
        recyclerItemClickListener.onItemLongClick(adapterPos, contactHolder.itemView); 
       } 
      } 
      return false; 
     } 
    }); 

    return contactHolder; 
} 

public void setOnItemClickListener(RecyclerItemClickListener recyclerItemClickListener) { 
    this.recyclerItemClickListener = recyclerItemClickListener; 
} 

リスナーファイル:

public interface RecyclerItemClickListener { 
    void onItemClick(int position, View view); 
    void onItemLongClick(int position, View v); 
} 

活動ファイル:

... 
@Override 
public void onItemClick(int position, View view) { 
    ActActivity.start(this, contactListAdapter.getItem(position)); 
} 

@Override 
public void onItemLongClick(int position, View v) { 
    Toast toast = Toast.makeText(this, "Test", Toast.LENGTH_LONG); 
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
    toast.show(); 
} 
+0

あなたはrecyclerviewで万が一onItemTouchListenerを実装しましたか?お持ちの場合は、取り外してからもう一度お試しください。 –

+0

いいえ私はonItemTouchListenerコードを使用しませんでした。 – AJW

答えて

0

定義されたビューホルダークラスに実装bindViewHolderメソッド内または任意にonClickListenerとonLongClickListenerを実装。あなたの問題を解決するはずです。

public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { 

      public CustomViewHolder(View itemView) { 
       super(itemView); 

       itemView.setOnLongClickListener(this); 
       itemView.setOnClickListener(this); 
      } 

      @Override 
      public boolean onLongClick(View view) { 

       int adapterPos = getAdapterPosition(); 
      if (adapterPos != RecyclerView.NO_POSITION) { 
       if (recyclerItemClickListener != null) { 
        recyclerItemClickListener.onItemLongClick(adapterPos, contactHolder.itemView); 
       } 
      } 
       return false; 
      } 

      @Override 
      public void onClick(View view) { 

       int adapterPos = getAdapterPosition(); 
      if (adapterPos != RecyclerView.NO_POSITION) { 
       if (recyclerItemClickListener != null) { 
        recyclerItemClickListener.onItemClick(adapterPos, contactHolder.itemView); 
       } 
      } 
       } 
      } 
     } 
関連する問題