Как вы реализуете программу повторного просмотра на клике во фрагменте? - PullRequest
0 голосов
/ 03 сентября 2018

Мой вопрос похож на этот.

Лучший подход для связи между Fragment / Activity и RecyclerView.Adapter?

Я знаю, как реализовать onClickListener, Interface и OnItemSelected метод в соответствующем действии, когда пользователь нажимает кнопку во фрагменте. У меня есть фрагмент со списком массивов. При нажатии на каждый элемент в списке массивов во фрагменте ExoPlayer откроется в новом действии или фрагменте. Насколько я понимаю, onItemClickListener не работает с Recyclerview. Как установить метод onClick для элементов в списке? Кроме того, я устанавливаю onClick вне RecyclerView? Это мой класс адаптера RecyclerView. Должен ли интерфейс принимать дополнительные параметры? Заранее спасибо.

открытый класс StepsAdapter расширяет RecyclerView.Adapter {

private static final String TAG = StepsAdapter.class.getSimpleName();
private ArrayList<Steps> stepsList = new ArrayList<Steps>();
private StepsAdapter.StepsAdapterOnClickHandler mClickHandler;

/**
 * The interface that receives onClick messages.
 */
public interface StepsAdapterOnClickHandler {
    void onClick(Steps stepClick);
}

/**
 * Creates a StepsAdapter.
 *
 * @param clickHandler The on-click handler for this adapter. This single handler is called
 *                     when an item is clicked.
 */
public StepsAdapter(StepsAdapterOnClickHandler clickHandler,ArrayList<Steps> stepsList) {
    mClickHandler = clickHandler;
    this.stepsList = stepsList;
}

/**
 * Cache of the children views for a steps list item.
 */
public class StepsAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    @BindView(R.id.step_short_desc)
    public TextView stepShortDescription;

    @BindView(R.id.step_description)
    public TextView stepDescription;

    public StepsAdapterViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);
        view.setOnClickListener(this);
    }

    /**
     * This gets called by the child views during a click.
     *
     * @param v The View that was clicked
     */
    @Override
    public void onClick(View v) {
        int adapterPosition = getAdapterPosition();
        Steps stepClick = stepsList.get(adapterPosition);
        mClickHandler.onClick(stepClick);
    }
}

@Override
public StepsAdapter.StepsAdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    Context context = viewGroup.getContext();
    int layoutIdForListItem = R.layout.steps_list_item;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;
    View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
    return new StepsAdapter.StepsAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(StepsAdapter.StepsAdapterViewHolder holder, int position) {

    //Binding data
    final Steps stepsView = stepsList.get(position);

    holder.stepShortDescription.setText(stepsView.getStepShortDescription());
    holder.stepDescription.setText(stepsView.getStepDescription());
}

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

public void setStepsList(ArrayList<Steps> mStepsList) {
    this.stepsList = mStepsList;
    notifyDataSetChanged();
}

}

Соответствующий фрагмент. Правильно ли реализован метод щелчка?

public class StepsListFragment extends Fragment implements StepsAdapter.StepsAdapterOnClickListener {

    // Tag for logging
    private final String TAG = StepsListFragment.class.getSimpleName();

    @BindView(R.id.recyclerview_steps)
    RecyclerView mRecyclerView;

    ArrayList<Steps> stepsArrayList;

    Recipes recipes;

    // Final Strings to store state information about the list of steps and list index
    public static final String STEPS_LIST_INDEX = "list_index";


    // Define a new interface OnStepsClickListener that triggers a callback in the host activity
    OnStepClickListener mCallback;

    // OnStepsClickListener interface, calls a method in the host activity named onStepSelected
    public interface OnStepClickListener {
        void onClick(Steps stepClick);
    }

    // Override onAttach to make sure that the container activity has implemented the callback
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

//        // This makes sure that the host activity has implemented the callback interface
//        // If not, it throws an exception
        try {
            mCallback = (OnStepClickListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + " must implement OnStepSelectedListener");
        }
    }

   /**
     * Mandatory empty constructor for the fragment manager to instantiate the fragment
     */
    public StepsListFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

//        //Inflate the Steps fragment layout
        View rootView = inflater.inflate(R.layout.fragment_steps, container, false);
//        // Bind the views
        ButterKnife.bind(this, rootView);

        Bundle bundle = this.getArguments();
        if (bundle != null) {
            recipes = getArguments().getParcelable("Recipes");

            stepsArrayList = new ArrayList<>();
            stepsArrayList = recipes.getRecipeSteps();
        }
        if (savedInstanceState != null) {
            //Restore the fragment's state here
            stepsArrayList = savedInstanceState.getParcelableArrayList(STEPS_LIST_INDEX);
        }

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext());
        mRecyclerView.setLayoutManager(mLayoutManager);
        Log.i("listSteps", stepsArrayList.size() + "");

        StepsAdapter stepsAdapter = new StepsAdapter(this, stepsArrayList);
        mRecyclerView.setAdapter(stepsAdapter);

        // Return the root view
        return rootView;
}

public void onClick(Steps stepClick){
        mCallback.onClick(stepClick);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveIn`enter code here`stanceState(outState);

        //Save the fragment's state here
        outState.putParcelableArrayList(STEPS_LIST_INDEX, stepsArrayList);
        super.onSaveInstanceState(outState);
    }  }

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Попробуйте это внутри OnBindviewHolder

 holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              //code here

        }
0 голосов
/ 03 сентября 2018

Лучший способ реализовать функцию щелчка для каждого элемента в представлении реселлера - это инициализация onClickListener, когда представление заполняется внутри в окне просмотра рециркулятора. Затем в методе onClick используйте пользовательский интерфейс / прослушиватель, чтобы перехватить активность клика в родительском фрагменте / активности.

Например: создайте подобный пользовательский интерфейс;

public interface RecyclerviewOnClickListener{
void recyclerviewClick(int position);
}

Теперь реализуйте этот интерфейс в вашем родительском упражнении / фрагменте, содержащем обзор переработчика. Предположим, что ваш фрагмент называется ChatFragment. Тогда,

public class ChatFragment extends Fragment implements RecyclerviewOnClickListener{
.
.
}

Это будет реализовывать функцию onClick (int position) в вашем фрагменте. В конструкторе вашего адаптера вы должны создать поле для RecyclerviewOnClickListener. Предположим, что ваш адаптер называется ChatAdapter, тогда

Конструктор адаптера.

public ChatAdapter(RecyclerviewClickListener listener, .....<other params>){
this.listener = listener;
}

В своем фрагменте вы можете инициализировать свой адаптер следующим образом

ChatAdapter adapter = new ChatAdapter(this, <any additional params>);

Вы также должны передать тот же экземпляр 'listener' вашему зрителю и инициализировать слушателя там также

Теперь в вашем ViewSolder Viewview, вы можете установить view.setOnClickListener(new OnClickListener{ this.listener.recyclerviewClick(getAdapterPosition()) });

Функция getAdapterPosition() возвращает позицию щелчка в обзоре реселлера, который получит обратный вызов в функции recyclerviewClick () вашего фрагмента.

Что касается количества параметров, которые вы передаете, вы можете использовать столько, сколько хотите, но для функции щелчка в обзоре переработчика идеальным способом является использование только одного параметра, который соответствует позиции. Теперь вы можете изменить содержимое списка, который вы передаете от своего фрагмента к адаптеру, и вызвать notifyDataSetChanged (), который обновит представление recycler. Надеюсь, это понятно.

...