【问题标题】:Help on a simple Android ListView problem一个简单的Android ListView问题帮助
【发布时间】:2011-05-11 00:46:26
【问题描述】:

我是 Android 新手,所以这似乎是一个基本问题。但我得到的是一个非常简单的类,称为 SingleItem,它有一个整数和一个字符串,以及每个的 getter 和 setter。在我的应用程序中,我得到了一个包含 SingleItem 对象集合的 ArrayList。我还有一个带有 ListView 小部件的布局。

我要做的是用我在 SingleItem 中的 String 值填充 ListView,但是当用户从 ListView 中选择一个项目时,我需要来自该 SingleItem 值的整数 ID。在 Android 开发中如何做到这一点?

【问题讨论】:

    标签: java android arraylist android-listview


    【解决方案1】:

    如果您使用自己的适配器来填充列表,那么在构建要返回的视图时,在 getView() 函数中,您可以在要返回的视图上调用 setTag() 并存储整个“SingleItem”对象。然后在您返回的视图的 onClickListener 中,您可以使用已单击视图的 getTag() 方法检索您的信息。

    编辑: 指定我指的是哪个 onClickListener

    【讨论】:

    • onCLickListener 用于选择整个列表视图。要返回特定项目的项目,您应该使用 OnItemSelectedListener
    • oi 我喜欢downvotes...我在所有自定义适配器中使用 1 onClickListener,在 getView() 函数中,我只需设置我构建的视图的 onClickListener 并返回到 1 onClickListener()适配器。这很好用,因为我可以使用 setTag() 将我需要的所有数据存储在一个对象中
    【解决方案2】:

    这里有一堆伪代码:创建你自己的适配器。这将为您提供执行各种操作的灵活性,但对您而言重要的是仅显示自定义类中的相关字段并制作更复杂的列表视图。一个不错的教程在这里:http://developerlife.com/tutorials/?p=327

    您将不得不处理 baseadapter 的其他覆盖,但关键是分配 singleItem.getString() 的值

    public class SingleItemAdapter extends BaseAdapter{
        private ArrayList<SingleItem> m_items= new ArrayList<SingleItem>();
              private Context mContext;
              public SingleItemAdapter (Context c,ArrayList<SingleItem> items) {
            mContext = c;
            m_items= items;
        }
    .
    .
    .
    
        @Override
        public Object getItem(int arg0) {
            return m_items.get(arg0);
        }
    
               @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
                 View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.singleitemview, null);
            }
                SingleItem i=(SingleItem) getITem(position)
                if(v!=null){
                    TextView tv=(TextView) v.findViewById(R.id.yourListItemView);
                    tv.setText(i.getStringValue());
    }
    
    }
    }
    

    定义您的自定义适配器后,您可以将其分配给列表视图并将侦听器分配给 OnItemSelectedListener。由于这会返回位置,因此您可以将其与 SingleItems 的 ArrayList 中的位置联系起来。

    .
    .
    .
    SingleItemAdapter sia=new SingleItemAdapter(this,yourArray);
    yourArrayList.setAdapter(sia);
    yourArrayList.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
        public void onItemSelected(AdapterView<?> parent, View v, int position, long row) {
              SingleItem si= yourArray.getItem(position);
               //do something with si.getValue();
    
    }
    
    .
    .
    .
    
    });
    

    【讨论】:

    • 提供工作代码片段并不是人们学习 jk 的方式。正确的方法是必须给他们一些解释,然后是一些代码片段,任何人都可以查看示例..但只有少数人会理解它。然后由程序员来学习适应他们正在使用的内容并为其提供上下文。永远不要成为一个复制和粘贴程序员,它会摧毁你作为一个程序员。总是问问题,不要只管它是什么。理解它。
    • 好点。我认为这不会太复杂,并且会为他指明正确的方向。我会用更多颜色编辑帖子。
    • 谢谢,这是一个学习/故障排除环境,不是解决方案中心。
    • 感谢投反对票:P 来自上次发布此答案的人的有趣评论:stackoverflow.com/questions/5520175/…
    • lol.. 太多人质疑数据库,所以理解模块化非常重要。所以我创建了那个帖子来帮助澄清这个问题。然而;带有解释的代码有很长的路要走。具体来说,我没有给他解决方案,我给了他做他需要的结构。 :) 巨大的差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多