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?

2voto

Liridon Sadiku Punkte 259

Greifen Sie auf die mainView von rowLayout(cell) für Ihr RecyclerView zu und schreiben Sie in Ihrem OnBindViewHolder diesen Code:

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        Movie movie = moviesList.get(position);
        holder.mainView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.out.println("pos " + position);
            }
        });
    }

2voto

That's Enam Punkte 290

Es hat für mich funktioniert. Hoffe es wird dir auch helfen. Auf einfachste Weise.

Innerhalb des View-Halters

class GeneralViewHolder extends RecyclerView.ViewHolder {
    View cachedView = null;

    public GeneralViewHolder(View itemView) {
        super(itemView);
        cachedView = itemView;
    }

Innerhalb von onBindViewHolder()

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
            final GeneralViewHolder generalViewHolder = (GeneralViewHolder) holder;
            generalViewHolder.cachedView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "Element wurde an "+position+ " angeklickt", Toast.LENGTH_SHORT).show();
                }
            });

Und lass mich wissen, hast du irgendwelche Fragen zu dieser Lösung?

2voto

dileep krishnan Punkte 306
 main_recyclerview.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e)
    {
        int position=rv.getChildAdapterPosition(rv.findChildViewUnder(e.getX(),e.getY()));

        switch (position)
        {
            case 0:
            {
                wifi(position);
                adapter2.notifyDataSetChanged();
            }
            break;

            case 1:
            {
                sound(position);
                adapter2.notifyDataSetChanged();
            }
            break;

            case 2:
            {
                bluetooth(position);
                adapter2.notifyDataSetChanged();
            }
            break;
        }
        return true;
    }

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

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

1voto

Janishar Ali Punkte 376

Verwenden Sie PlaceHolderView

@Layout(R.layout.item_view_1)
public class View1{

    @View(R.id.txt)
    public TextView txt;

    @Resolve
    public void onResolved() {
        txt.setText(String.valueOf(System.currentTimeMillis() / 1000));
    }

    @Click(R.id.btn)
    public void onClick(){
        txt.setText(String.valueOf(System.currentTimeMillis() / 1000));
    }
}

1voto

Manikanta Punkte 3421

Statt das Interface View.OnClickListener innerhalb des View-Halters zu implementieren oder ein Interface zu erstellen und das Interface in Ihrer Activity zu implementieren.. Habe ich diesen Code für eine einfache OnClickListener-Implementierung verwendet.

public static class SimpleStringRecyclerViewAdapter
            extends RecyclerView.Adapter {

        // Ihre Initialisierungen kommen hierhin...
        private List mValues;

        public static class ViewHolder extends RecyclerView.ViewHolder {

            // Erstellen Sie eine Variable mView
            public final View mView;

            /* Alle Ihre Zeilen-Widgets kommen hierhin
            public final ImageView mImageView;
            public final TextView mTextView;*/

            public ViewHolder(View view) {
                super(view);
                // Initialisieren Sie es hier
                mView = view;

                /* Die Initialisierungen Ihrer Zeilen-Widgets kommen hierhin
                mImageView = (ImageView) view.findViewById(R.id.avatar);
                mTextView = (TextView) view.findViewById(android.R.id.text1);*/
            }
        }

        public String getValueAt(int position) {
            return mValues.get(position);
        }

        public SimpleStringRecyclerViewAdapter(Context context, List items) {

            mBackground = mTypedValue.resourceId;
            mValues = items;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item, parent, false);
            view.setBackgroundResource(mBackground);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            holder.mBoundString = mValues.get(position);
            holder.mTextView.setText(mValues.get(position));

            // Hier ist es einfach, den onItemClick-Listener hier zu schreiben
            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    Intent intent = new Intent(context, ExampleActivity.class);

                    context.startActivity(intent);
                }
            });
        }

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

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