1048 Stimmen

Warum hat RecyclerView keine onItemClickListener()?

Ich habe RecyclerView erkundet und war überrascht zu sehen, dass RecyclerView keine onItemClickListener() hat.

Ich habe zwei Fragen.

Hauptfrage

Ich möchte wissen, warum Google onItemClickListener() entfernt hat?

Gibt es ein Leistungsproblem oder etwas anderes?

Nebenfrage

Ich habe mein Problem gelöst, indem ich onClick in meinem RecyclerView.Adapter geschrieben habe:

public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
    }

    @Override
    public void onClick(View v) {

    }
}

Ist das okay / gibt es einen besseren Weg?

0voto

Chathura Jayanath Punkte 609

Ich habe eine Bibliothek geschrieben, um das Klicken auf ein Element der Android-Recycler-View zu behandeln. Sie finden das gesamte Tutorial unter https://github.com/ChathuraHettiarachchi/RecycleClick

RecycleClick.addTo(DEIN_RECYCLEVIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() {
            @Override
            public void onItemClicked(RecyclerView recyclerView, int position, View v) {
                // DEIN CODE
            }
        });

oder um das Drücken auf ein Element lange zu behandeln, können Sie verwenden

RecycleClick.addTo(DEIN_RECYCLEVIEW).setOnItemLongClickListener(new RecycleClick.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) {
                // DEIN CODE
                return true;
            }
        });

0voto

王 能 Punkte 791

RecyclerView-Animation wurde nicht getestet, das andere ist normal. Ich denke, es wurde maximal optimiert. Das Interface hat andere Verwendungen, die vorübergehend ignoriert werden können.

public abstract class BaseAdapterRV extends RecyclerView.Adapter implements AdapterInterface {
    public final String TAG = getClass().getSimpleName();

    protected final Activity mActivity;
    protected final LayoutInflater mInflater;
    protected ItemClickInterface mListener;

    public BaseAdapterRV(Activity activity) {
        mActivity = activity;
        mInflater = LayoutInflater.from(mActivity);
    }

    @Override
    public final VH onCreateViewHolder(ViewGroup parent, int viewType) {
        return onCreateViewHolder(parent, viewType, mInflater);
    }

    @Override
    public final void onBindViewHolder(VH holder, int position) {
        holder.itemView.setTag(R.id.tag_view_click, position);
        //
        holder.itemView.setOnClickListener(mListener);
        holder.itemView.setOnLongClickListener(mListener);
        onBindVH(holder, position);
    }

    ///////////////////////////////////////////////////////////////////////////
    // 
    ///////////////////////////////////////////////////////////////////////////

    /**
     * !notifyItemInsertedposition
     * onItemLongClick
     */
    public void setOnItemClickListener(ItemClickInterface listener) {
        mListener = listener;
        notifyDataSetChanged();
    }

    @NonNull
    protected abstract VH onCreateViewHolder(ViewGroup parent, int viewType, LayoutInflater inflater);

    protected abstract void onBindVH(VH holder, int position);

}

Dies ist ein Interface

/**
 * OnItemClickListener
 * {@link OnItemClickListener}{@link OnItemItemClickListener}
 */
public interface ItemClickInterface extends View.OnClickListener, View.OnLongClickListener {

    void onItemClick(DATA1 data1, DATA2 data2);

    boolean onItemLongClick(DATA1 data1, DATA2 data2);
}

Dies ist eine abstrakte Klasse

public abstract class OnItemClickListener implements ItemClickInterface {
    @Override
    public void onClick(View v) {
        onItemClick(v, (DATA) v.getTag(R.id.tag_view_click));
    }

    @Override
    public boolean onLongClick(View v) {
        return onItemLongClick(v, (DATA) v.getTag(R.id.tag_view_click));
    }

    @Override
    public boolean onItemLongClick(View view, DATA data) {
        return false;
    }
}

Sie benötigen nur das Folgende

    mAdapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(View view, Integer integer) {

        }

        @Override
        public boolean onItemLongClick(View view, Integer integer) {
            return true;
        }
    });

0voto

sanevys Punkte 537

Ich habe einen der kürzesten Wege gefunden, um androidx Lifecycle MutableLiveData zu verwenden

Adapter:

private val onItemClickListener = MutableLiveData()

override fun onBindViewHolder(holder: GifsViewHolder, position: Int) {
    holder.itemView.setOnClickListener { onItemClickListener.value = gifs[position] }
}
fun getOnItemClickListener(): MutableLiveData {
    return onItemClickListener
}

irgendwo in MainActivity

    yourFancyAdapter.getOnItemClickListener().observe(this, Observer {
        println(it)
    })

-5voto

dave Punkte 1

Der einfachste Weg, dies zu tun, ist wie folgt:

Deklariere die globale Variable am Anfang der Adapterklasse:

// Hier speichern, damit wir es wiederverwenden können
private View yourItemView;

Dann setze den OnClickListener innerhalb der Methode onBindViewHolder:

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

    // Setze den onClick-Listener
    yourItemView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(mContext,Integer.toString(position),Toast.LENGTH_SHORT).show();
        }
    });

}

Alle anderen Antworten sind falsch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X