从 ListView CustomAdapter 中获取选中项的值

Get selected item value from ListView CustomAdapter

我有带有自定义适配器的列表视图。每行项目都有激活弹出菜单的按钮。当用户单击其中一项时,它应该会显示一些数据。

这是物品持有人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;
}

}

这里是 CustomAdapter 的 getView 方法,它扩展了 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;      

}

当用户 select 某些项目时,它应该打印出 UID。当我有 3-4 个项目时,这很好用......但是如果我向下滚动并假设他 select 第 12 个项目,他将获得与前四个项目之一相同的 UID。似乎当我向下滚动列表视图时,列表中总是有 4 个项目,而不是 12 个或更多...如何解决这个问题?

我认为最好的方法是使用 recyclerview 而不是 listview For any help take a look here

你在使用 ViewHolder 时做错了。您的代码仅检查 view = null 然后为该位置膨胀行。所以你不能存储视图的值。

当检查 view != null 并获取该视图时,您需要将行存储为 viewholder 的标签。

您可以检查 link 以了解 Viewholder 在列表视图中的工作方式:

我知道有人建议你使用 RecyclerView,但我想建议你先了解 viewHolder/listview。最危险的是只复制代码却不知道它是如何工作的。