Search code examples
androidlistviewbaseadaptercustom-adapter

Get selected item value from ListView CustomAdapter


I have listview with custom adapter. Each row of item has button that activates popup menu with. When user click on one of the items it should display some data.

Here is the item holder class:

public class cNalog {

public String IDNalog;
public String NazivKlijenta;
public String OpisNaloga;
public String Napomena;
public int Hitnost;

public cNalog(String IDNalog, String nazivKlijenta, String opisNaloga, int hitnost) {
    this.IDNalog = IDNalog;
    NazivKlijenta = nazivKlijenta;
    OpisNaloga = opisNaloga;
    Hitnost = hitnost;
}

public cNalog() {}

public String getIDNalog() {
    return IDNalog;
}

public void setIDNalog(String IDNalog) {
    this.IDNalog = IDNalog;
}

public String getNazivKlijenta() {
    return NazivKlijenta;
}

public void setNazivKlijenta(String nazivKlijenta) {
    NazivKlijenta = nazivKlijenta;
}

public String getOpisNaloga() {
    return OpisNaloga;
}

public void setOpisNaloga(String opisNaloga) {
    OpisNaloga = opisNaloga;
}

public String getNapomena() {
    return Napomena;
}

public void setNapomena(String napomena) {
    Napomena = napomena;
}

public int getHitnost() {
    return Hitnost;
}

public void setHitnost(int hitnost) {
    Hitnost = hitnost;
}

}

And here is the getView method from CustomAdapter that extend BaseAdapter class:

 @Override
public View getView(final int i, View view, ViewGroup viewGroup) {

    final ViewHolder holder;

    if (view == null)
    {
        holder = new ViewHolder();

        LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE);

        view = mInflater.inflate(R.layout.popisnaloga_red, null);

        holder.btnPopUpMenu = (Button) view.findViewById(R.id.btnPopUpNalog);

        holder.btnPopUpMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                PopupMenu popup = new PopupMenu(mContext, view);
                popup.getMenuInflater().inflate(R.menu.popup_nalog, popup.getMenu());
                //holder.uidNalog = mData.get(_i).getIDNalog();

                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem menuItem) {
                        Toast.makeText(mContext,
                                "Your Message", Toast.LENGTH_LONG).show();

                        switch (menuItem.getItemId()) {
                            case R.id.mnuActionInfo:
                                Log.i("Selekcija", mData.get(i).getIDNalog()); //Info(mData.get(i).getOpisNaloga());
                            default:
                                return false;
                        }
                    }
                });

                popup.show();
            }
        });
    }

    TextView tvOpisRada = (TextView)view.findViewById(R.id.viewNazivNaloga);
    tvOpisRada.setText(mData.get(i).getOpisNaloga());

    return view;
}


private class ViewHolder {

    protected Button btnPopUpMenu;      

}

When user select some item it should print out UID. This works fine when I have 3-4 items... but if I scrool down and let's say he select 12th item he get the same UID as the one of the first fours item. It seems that when I scrool down the listview acts like there is always 4 items in list not 12 or more... How to solve this?


Solution

  • you did wrong when use ViewHolder. Your code only check if view = null then inflate row for that position. So you can not store view's value.

    You need to store row as a tag of viewholder, when check when view != null and get that view.

    You can check that link to know how Viewholder work in listview: Implements ViewHolder on a ListView AndroidStudio

    I know someone suggest you to use RecyclerView, but I want to suggest you to know about viewHolder/listview first. The most dangerous thing is just copy code but dont know how it work.