WebHU - Programozási kérdések és válaszok

Hogyan hozhatok létre kattintási eseményt a CardView elemen a RecyclerView-ból

Hivatkoztam az Egyszerű Android RecyclerView-példára a Recyclerview elemeire vonatkozó kattintási eseményekhez. Aztán ezt a módszert alkalmaztam a CardView-re a Recyclerview-ból, de nem sikerült.

Az OnClick esemény a ViewHolderen nem működik. Úgy tűnik, a kódok szinte azonosak. Nem tudom mi a probléma.

Most másoltam ki a kódokat az Simple Android RecyclerView példából

Ezután az ArrayList-et ArrayList-re változtattam. Ezenkívül a textview kódot tartalmazó xml-t kártyanézetre cserélem.

Sikerült az esemény, amikor az onClickListenert az onBindViewHolderre tettem. De azt hallottam, hogy nehezebbé teszi az alkalmazást. Szóval ezt az utat szeretném elkerülni.

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyAdapter.ItemClickListener{

    RecyclerView mRecyclerView;
    MyAdapter mAdapter;
    RecyclerView.LayoutManager mLayoutManager;
    ArrayList<MyData> myDataset;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        myDataset = new ArrayList<>();
        myDataset.add(new MyData("#InsideOut", R.drawable.a));
        myDataset.add(new MyData("#Mini", R.drawable.b));
        myDataset.add(new MyData("#ToyStroy", R.drawable.c));

        mAdapter = new MyAdapter(this, myDataset);
        mAdapter.setClickListener(this);
        mRecyclerView.setAdapter(mAdapter);
    }
    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + mAdapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
    }
}

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private ArrayList<MyData> mDataset;
    private LayoutInflater mInflater;

    private ItemClickListener mClickListener;


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        // each data item is just a string in this case
        public ImageView mImageView;
        public TextView mTextView;
        public CardView cv;

        public ViewHolder(View view) {
            super(view);
            mImageView = (ImageView)view.findViewById(R.id.image);
            mTextView = (TextView)view.findViewById(R.id.textview);
            cv = (CardView)view.findViewById(R.id.cardview);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
            Log.d("이거이거", ""+getAdapterPosition());
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(Context context, ArrayList<MyData> myDataset) {
        this.mDataset = myDataset;
        this.mInflater = LayoutInflater.from(context);
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = mInflater.inflate(R.layout.item_cardview, parent, false);
        return new ViewHolder(v);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        Log.d("position", position+"");

        holder.mTextView.setText(mDataset.get(position).text);
        holder.mImageView.setImageResource(mDataset.get(position).img);

    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.size();
    }
    MyData getItem(int id) {
        return mDataset.get(id);
    }

    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

class MyData{
    public String text;
    public int img;
    public MyData(String text, int img){
        this.text = text;
        this.img = img;
    }
}

  • Engedélyezni szeretné a műveletet a teljes kártyanézetre vagy a kártyanézeten belüli bármely nézetre kattintva? @csiga 22.04.2019
  • @g.brahma Datta um.. ha nem bánod, bármelyiket szeretném tudni. de az eredeti az egész kártyanézet 23.04.2019
  • Biztos. Ellenőrizze a válaszomat lent: @csiga. 23.04.2019

Válaszok:


1

Erre is van mód

 public ViewHolder(final View view) {
        super(view);
        mImageView = (ImageView)view.findViewById(R.id.image);
        mTextView = (TextView)view.findViewById(R.id.textview);
        cv = (CardView)view.findViewById(R.id.cardview);

        cv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mClickListener != null) mClickListener.onItemClick( view,getAdapterPosition());
            }
        });
}
22.04.2019
  • ezt veszem megoldásnak. De még mindig szeretném tudni, hogy miért nem működik a kódom. thx a válaszért. 23.04.2019

  • 2

    A probléma az, hogy a interface a adapter class része, míg a onclicklistener a holder class része. Meg kell hívni az clicklistener-et az adapterről onBindViewHolder.Ehhez a id-et meg kell adni a itemholder layout file gyökér elrendezéséhez, és meg kell találni a nézetet azonosító alapján a itemholder constructor-ben. Ezt követően hívhatja a clicklistenert az alábbiak szerint.

     @Override
        public void onBindViewHolder(ViewHolder holder, final int position) {
            // - get element from your dataset at this position
            // - replace the contents of the view with that element
            Log.d("position", position+"");
    
            holder.mTextView.setText(mDataset.get(position).text);
            holder.mImageView.setImageResource(mDataset.get(position).img);
            holder.view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mClickListener.onItemClick(v, position)
            }
        });
        }
    
    23.04.2019
  • Az OnclickListener az onBindViewHolderben rossz gyakorlat @Raza. 23.04.2019

  • 3

    Egyszerűen adja hozzá ezeket az alábbi sorokat az onBindViewHolder-ben, amelyet már hozzáadott

    cv = (CardView)view.findViewById(R.id.cardview);

    sort, hogy működjön, vagy győződjön meg arról, hogy a CardView-t az xml azonosítóban adja meg, hogy a név cardview

    cv = (CardView)view.findViewById(R.id.cardview);
    
    holder.cv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mClickListener.onItemClick(v, position)
            }
        });
    
    23.04.2019

    4
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        // each data item is just a string in this case
        public ImageView mImageView;
        public TextView mTextView;
        public CardView cv;
    
        public ViewHolder(View view) {
            super(view);
            mImageView = (ImageView)view.findViewById(R.id.image);
            mTextView = (TextView)view.findViewById(R.id.textview);
            cv = (CardView)view.findViewById(R.id.cardview);
    
          //for whole cardview (If you want to click only card)
          view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //Do the action.
                }
            });
    
        //if you want to click the only particular item in the CardView
        mImageView .setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   //Do the action.
                }
            });
    
        }
    }
    

    Próbálja ki ezt a részletet, és tudassa velem. Meg tudom oldani, ha nem megy.

    23.04.2019
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..