Как реализовать два OnClickListeners на элементе RecyclerView нажмите? - PullRequest
0 голосов
/ 04 мая 2019

Я в замешательстве, так как мне нужно использовать два OnClickListener для двух разных нужд.У меня есть Recyclerview, который, как только любой его элемент, после нажатия, нужно изменить, и я успешно реализовал это, используя OnBindViewHolder.itemView.setOnClickListener

Теперь я хочу, чтобы тот же самый щелчок обновил мой BottomAppBar и для этого,Я добавил интерфейс к своему классу ItemHolder.Проблема в том, что теперь, когда я нажимаю, из-за интерфейса (я полагаю) ничего не происходит.

Я знаю, что может быть немного сложно понять мою ситуацию, поэтому я добавляю следующий код, чтобы помочь с этим:

public class MainActivity extends AppCompatActivity implements MultiViewTypeAdapter.IClickListener {

имеет эту функцию:

 @Override
    public void onItemClick(View view, int position) {
        int type = adapter.getItemViewType(position);
        if (type == 0) {
            bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_END);
            bar.replaceMenu(R.menu.bab_menu_chosen_project);
            fab.setImageDrawable(getDrawable(R.drawable.ic_message_white_24dp));
        }
        else{
            bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_CENTER);
            bar.replaceMenu(R.menu.bab_menu_primary);
            fab.setImageDrawable(getDrawable(R.drawable.ic_reply_black_24dp));
        }

    }

интерфейс на адаптере выглядит следующим образом:

public interface IClickListener {
        void onItemClick(View view, int position);
    }

что я сейчас делаю на public static class SelectedProjectItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {это:

@Override
        public void onClick(View v) {
            listener.onItemClick(v, getAdapterPosition());
        }

однако, что я хочу запустить, это то, что я делаю на

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {

:

((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dataSet.remove(listPosition);
                        dataSet.add(listPosition, unselectedCards.get(listPosition));
                        notifyItemChanged(listPosition);
                    }
                });

Я хочу две вещипроизойдет одним щелчком мыши - элемент в Recyclerview изменится с использованием последнего фрагмента кода, который я описал, а меню в моей MainActivity изменится с использованием первого фрагмента кода, который я описал.

СПАСИБО ПОМОЩЬ!

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Удалите приведенный ниже код из RecyclerView.ViewHolder

@Override
public void onClick(View v) {
    listener.onItemClick(v, getAdapterPosition());
}

И добавьте событие списка в «itemView», нажмите, как показано ниже:

((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(listener != null){
                            listener.onItemClick(v, getAdapterPosition());
                        }
                        dataSet.remove(listPosition);
                        dataSet.add(listPosition, unselectedCards.get(listPosition));
                        notifyItemChanged(listPosition);
                    }
                });
0 голосов
/ 04 мая 2019

Вы можете изменить ширину BottomBar тем же (уникальным) щелчком, используя UIHandler или MainLoop, с помощью которого вы можете получить доступ к интерфейсу из вашего адаптера. на вашем OnCreate:

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 //.....
Handler uiHandle = new Handler(getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle b = (Bundle) msg.obj;
            int p = b.getInt("position");
            Toast.makeText(MainActivity.this, "Change here your BottomBAR",     Toast.LENGTH_SHORT).show();

        }
    };

.. а в вашем адаптере ...

 yourobjectclick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

           // example: first change color of my object that I have clicked
                ((TextView)v).setTextColor( mContext.getResources().getColor(R.color.blue_100));
                Bundle bundle = new Bundle();
               //i can store the position about click and
                bundle.putInt("position",position);

                Message message = handler.obtainMessage();
                message.obj = bundle;
                // i have access tu User Interface objects from here

           // next change my bottombar sending a message to UI
           handler.sendMessage(message);
                Toast.makeText(mContext, "onClick: su -> "+tvBikeName.getText(), Toast.LENGTH_SHORT).show();
            }
        });
0 голосов
/ 04 мая 2019

Я надеюсь решить, используя мой ответ, у вас есть много способов решить эту проблему

1-используя интерфейс

Поскольку API-интерфейс радикально изменился, он неМеня не удивит, если вы создадите OnClickListener для каждого элемента.Это не так много хлопот, хотя.В вашей реализации RecyclerView.Adapter у вас должны быть: private final OnClickListener mOnClickListener = new MyOnClickListener ();

@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
    view.setOnClickListener(mOnClickListener);
    return new MyViewHolder(view);
}

@Override
public void onClick(final View view) {
    int itemPosition = mRecyclerView.getChildLayoutPosition(view);
    String item = mList.get(itemPosition);
    Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}

2 - использование при клике в XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:onClick="functionOnUrActivity">

</RelativeLayout>

и установка этогофункция для вашей активности

public void functionOnUrActivity(View v){
}

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

...