Aangepaste lijstweergave heeft een knop - Hoe detecteer je op welke rij de knop is ingedrukt?

Ik maak een inventory-tracker-app voor Android voor een oefenproject. Ik gebruik SQLite voor de opslag en mijn ListView geeft de inhoud van de database weer met een CursorAdapter . Ik gebruik CursorLoader om de gegevens uit de database op te halen

Elke rij in mijn ListView heeft een paar TextViews en een knop . Ik ben van plan om de knop te gebruiken om de hoeveelheidskolom/eigenschap van het geselecteerde item in de database te verlagen.

Waar stel ik de knop OnClick listener in? In mijn Activiteit -klasse of mijn CursorAdapter class ' bindView() ?

Ook hoe kan ik detecteren met welke rij op de knop werd gedrukt vanaf het klikken op de knop?

Ik heb de onItemClickListener van ListView al gebruikt om de gebruiker naar een gedetailleerde activiteit te sturen die meer informatie over de huidige rij weergeeft. Dat had een id-argument dat wordt aangenomen. Dus ik vind een equivalent dat ik kan gebruiken voor de knoppen die ik in elke rij zet.

0
Stel dat in CursorAdapter .
toegevoegd de auteur John Joe, de bron

5 antwoord

Geef in onBindViewHolder een label op die knop. dat label kan de positie van het item of het item zelf zijn. (tag kan object zijn)

 override fun onBindViewHolder(holder: ItemHolder, position: Int) {
   CUSTOMMODEL item = items[position];
   ...
   holder.button.setTag(item);
   //OR
   holder.button.setTag(position);
   ...
   holder.button.setOnClickListener(clickListener);
}

in je onClick (View view) methode, haal tag uit de view en je kunt begrijpen op welk item wordt geklikt.

0
toegevoegd

U kunt een interface in uw adapter maken en een fucntion in deze interface zoals ** ongeldig itemClick (int positie) ** verklaren en die interface in uw activiteit implementeren

voor ongeldig itemKlik (int positie) methode: - Definieer het aan

holder.setOnClickListener() block like -

 viewHolder.button.setOnClickListener(new OnClickListener() {  

            @Override  
            public void onClick(View v) {  
                if (yourInterface != null) {  
                    yourInterface.itemClick(position);  
                }  

            }  
        }); 

For detailed description refer the below link -

https : //www.c-sharpcorner.com/UploadFile/9e8439/create-custom-listener-on-button-in-listitem-listview-in-a/

0
toegevoegd

This question has been answered already, you need to setup your list items as not clickable and manually listen for onClick events of buttons, see a detailed answer here: Android : How to set onClick event for Button in List item of ListView

0
toegevoegd
public class MyCustomAdapter extend Adapter {
    private MyOnClickListener mListener;

    @Override
    public View getView(int position, View view, ViewGroup parent)
    {

        ...

       //Your view
        mContainer.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                mListener.onWholeItemClick(position);
            }
        });

       //Your button
        mButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                mListener.onButtonClick(position);
            }
        });
    }

    public void setListener(MyOnClickListener listener) {
        this.mListener = listener;
    }

   //Listener interface
    public interface MyOnClickListener() {
        void onWholeItemClick(int position);//Can pass data as a parametter
        void onButtonClick(int position); 
    }
}

public class MyActivity extend Activity implement MyOnClickListener() {
    ...

    @Override
    public void onCreate(...) {
        mAdapter = new MyCustomAdapter(this);
        mAdapter.setListener(this);//Pass the listener to adapter
    }

    @Override
    public void onWholeItemClick(int position) {
       //
    }

    @Override 
    public void onButtonClick(int position) {
        //
    }

}

Dat hoe je volledig klik evenementen kunt hanhle

0
toegevoegd

Kijk het volgende. Ik heb de Custom-adapter gebruikt om de onItemClickListener toe te voegen:

private class MyListAdapter(val ctx: Context, val values: List) : ArrayAdapter(ctx, -1, values) {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
         val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val rowView = inflater.inflate(R.layout.item_my_layout, parent, false)
        rowView.setOnClickListener {
            val detailsActivity = Intent(ctx, DetailsActivity::class.java)
            detailsActivity.putExtra(DetailsActivity.ROUTE_NUMBER_PARAM, values.get(position).routeNumber)
            val bundle = Bundle()
            bundle.putParcelable(detailsActivity.ROUTE_NO_STRUCTURE_PARAM, values.get(position).strucutre)
            detailsActivity.putExtra(detailsActivity.PARAM_BUNDLE, bundle)
            ctx.startActivity(detailsActivity)
        }
        return rowView
    }
}
0
toegevoegd