从 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。最危险的是只复制代码却不知道它是如何工作的。
我有带有自定义适配器的列表视图。每行项目都有激活弹出菜单的按钮。当用户单击其中一项时,它应该会显示一些数据。
这是物品持有人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。最危险的是只复制代码却不知道它是如何工作的。