0

Я пытаюсь реализовать на item click для разных предметов, которые я всплываю в RecyclerView. Я достиг этого в listView, но RecyclerView кажется сложным. Я смотрю на подобные вопросы, но не могу найти решение.item click for recycler view

если пользователь нажмет на Один, я хочу, чтобы он что-то делал, а также для двоих и трех. Как мне добиться этого?

Вот мои коды

public class MainFragment extends Fragment implements SearchView.OnQueryTextListener { 

    public static MainFragment newInstance() { 
     return new MainFragment(); 
    } 

    private static final String[] MOVIES = new String[]{ "One", "Two", "Three" }; 

    private RecyclerView mRecyclerView; 
    private ExampleAdapter mAdapter; 
    private List<ExampleModel> mModels; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.tms, container, false); 

     mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 

     return view; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     setHasOptionsMenu(true); 

     mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

     mModels = new ArrayList<>(); 

     for (String movie : MOVIES) { 
      mModels.add(new ExampleModel(movie)); 
     } 

     mAdapter = new ExampleAdapter(getActivity(), mModels); 
     mRecyclerView.setAdapter(mAdapter); 


    } 


    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.search_two, menu); 

     final MenuItem item = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); 
     searchView.setOnQueryTextListener(this); 
    } 

    @Override 
    public boolean onQueryTextChange(String query) { 
     final List<ExampleModel> filteredModelList = filter(mModels, query); 
     mAdapter.animateTo(filteredModelList); 
     mRecyclerView.scrollToPosition(0); 
     return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 
     return false; 
    } 

    private List<ExampleModel> filter(List<ExampleModel> models, String query) { 
     query = query.toLowerCase(); 

     final List<ExampleModel> filteredModelList = new ArrayList<>(); 
     for (ExampleModel model : models) { 
      final String text = model.getText().toLowerCase(); 
      if (text.contains(query)) { 
       filteredModelList.add(model); 
      } 
     } 
     return filteredModelList; 
    } 
} 

ViewHolder

public class ExampleViewHolder extends RecyclerView.ViewHolder { 

    private final TextView tvText; 

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

     tvText = (TextView) itemView.findViewById(R.id.tvText); 
    } 

    public void bind(ExampleModel model) { 
     tvText.setText(model.getText()); 
    } 
} 

Вот адаптер, который расширяет RecyclerView-

public class ExampleAdapter extends RecyclerView.Adapter<ExampleViewHolder> { 

    private final LayoutInflater mInflater; 
    private final List<ExampleModel> mModels; 

    public ExampleAdapter(Context context, List<ExampleModel> models) { 
     mInflater = LayoutInflater.from(context); 
     mModels = new ArrayList<>(models); 
    } 

    @Override 
    public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     final View itemView = mInflater.inflate(R.layout.it_file, parent, false); 
     return new ExampleViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(ExampleViewHolder holder, int position) { 
     final ExampleModel model = mModels.get(position); 
     holder.bind(model); 
    } 

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

    public void animateTo(List<ExampleModel> models) { 
     applyAndAnimateRemovals(models); 
     applyAndAnimateAdditions(models); 
     applyAndAnimateMovedItems(models); 
    } 

    private void applyAndAnimateRemovals(List<ExampleModel> newModels) { 
     for (int i = mModels.size() - 1; i >= 0; i--) { 
      final ExampleModel model = mModels.get(i); 
      if (!newModels.contains(model)) { 
       removeItem(i); 
      } 
     } 
    } 

    private void applyAndAnimateAdditions(List<ExampleModel> newModels) { 
     for (int i = 0, count = newModels.size(); i < count; i++) { 
      final ExampleModel model = newModels.get(i); 
      if (!mModels.contains(model)) { 
       addItem(i, model); 
      } 
     } 
    } 

    private void applyAndAnimateMovedItems(List<ExampleModel> newModels) { 
     for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) { 
      final ExampleModel model = newModels.get(toPosition); 
      final int fromPosition = mModels.indexOf(model); 
      if (fromPosition >= 0 && fromPosition != toPosition) { 
       moveItem(fromPosition, toPosition); 
      } 
     } 
    } 

    public ExampleModel removeItem(int position) { 
     final ExampleModel model = mModels.remove(position); 
     notifyItemRemoved(position); 
     return model; 
    } 

    public void addItem(int position, ExampleModel model) { 
     mModels.add(position, model); 
     notifyItemInserted(position); 
    } 

    public void moveItem(int fromPosition, int toPosition) { 
     final ExampleModel model = mModels.remove(fromPosition); 
     mModels.add(toPosition, model); 
     notifyItemMoved(fromPosition, toPosition); 
    } 
} 

, если пользователь нажимает на один, я хотите, чтобы он что-то делал, а также два и три. Как мне добиться этого?

+0

см. Androidhive или вы можете следить за Android Nerd answer .. это лучшее решение для вашего вопроса. –

ответ

0

Вы можете добавить setOnClickListener в onBindViewHolder вашего адаптера и использовать model переменную там

1

MainActivity.java

public interface ClickListener { 
    void onClick(View view, int position); 
    void onLongClick(View view, int position); 
} 

public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 

    private GestureDetector gestureDetector; 
    private MainActivity.ClickListener clickListener; 

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final MainActivity.ClickListener clickListener) { 
     this.clickListener = clickListener; 
     gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e) { 
       View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
       if (child != null && clickListener != null) { 
        clickListener.onLongClick(child, recyclerView.getChildPosition(child)); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 

     View child = rv.findChildViewUnder(e.getX(), e.getY()); 
     if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
      clickListener.onClick(child, rv.getChildPosition(child)); 
     } 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 

И

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new ClickListener() { 
    @Override 
    public void onClick(View view, int position) { 
     Movie movie = movieList.get(position); 
     Toast.makeText(getApplicationContext(), movie.getTitle() + " is selected!", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onLongClick(View view, int position) { 
    } 
})); 

Вы должны сделать интерфейса, и вы используете GestureDetector для обнаружения вида был нажат!

Пожалуйста, обратите внимание, что его просто пример, чтобы дать намеки на вас

Просто попробуйте сами знаете, что происходит в этом коде и то, что вам нужно, это то, что вы хотите. Вы можете отредактировать и повторно использовать этот пример для вас.

+0

Большое спасибо. Теперь я понимаю лучше - – Cistem

+0

Если вы сочтете это полезным, пожалуйста, примите этот ответ, чтобы помочь другим –

1

Вы можете привязать к onClickListeneritemView, как это:

@Override 
public void onBindViewHolder(ExampleViewHolder holder, int position) { 
    final ExampleModel model = mModels.get(position); 
    holder.bind(model); 
    holder.itemView.setOnClickListener(... { 

     if(position == 1){ 
      ... 
     }else{ 
      ... 
     } 

    }); 
} 

или сделать это в ExampleViewHolder.bind(), то вы можете передать аргумент к нему как position.