将ID数据附加到列表视图项目

我有一个应用程序获取存储在服务器上的xml文件的公告,并将每个公告的标题和作者加载到ListView项目中。 我还需要存储每个项目的每个公告的ID,但我实际上并不需要显示它。 我想可能会把ID存储在我用来填充列表的哈希映射中,然后find与所点击的标题相关的ID,但是我认为这将是不安全的,因为两个公告可能具有相同的标题(以及作者和date) 。 我也想过为每个项目添加一个不可见的TextView来存储ID,但是这导致了布局问题。 最后,我search周围,发现setTag()和getTag(),我认为这将是我想要做的完美,但我真的不知道如何使用它们与SimpleAdapter(我相对比较新… … – )。 如果TextView的想法是我需要做的(虽然我怀疑它),这里是我用于每个项目的布局:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@android:id/text1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:textAppearance="?android:attr/textAppearanceMedium"/> <LinearLayout android:orientation="horizontal" android:id="@+id/items" android:weightSum="100" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@android:id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_weight="85"/> <LinearLayout android:orientation="vertical" android:id="@+id/itemCB" android:layout_weight="15" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center"> <CheckBox android:id="@+id/cbSelected" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> </LinearLayout> 

我正在使用下面的适配器来填充列表:

 for(int i = 0; i < ann.length; i++) { map = new HashMap<String, String>(); map.put("line1", ann[i].getTitle()); map.put("line2", "Posted by: " + ann[i].getAuthor() + "\n" + ann[i].date.toLongString()); list.add(map); } String[] from = { "line1", "line2"}; int[] to = { android.R.id.text1, android.R.id.text2}; SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.twoline_checkbox_id_listitem, from, to); setListAdapter(adapter); 

感谢您的任何帮助!

Solutions Collecting From Web of "将ID数据附加到列表视图项目"

理论上你可以做任何一个方法,它可能会没有问题的工作。 然而,从长远来看,我会说你会更好的一个简单的实体对象和自定义适配器。 更具体地说,从它的外观来看,我会select一个ArrayAdapter,而你似乎已经在使用某种简单的实体对象来处理数组了。

有大量的例子可以告诉你如何扩展ArrayAdapter。 然而,最重要的部分是getView()方法,它的最基本的forms可能看起来像这样:

 public View getView(int position, View convertView, ViewGroup parent) { View row; if (null == convertView) { row = mInflater.inflate(R.layout.list_item, null); } else { row = convertView; } MyObject item = (MyObject) getItem(position); TextView tv = (TextView) row.findViewById(android.R.id.xxx); tv.setText(item.getTitle); // same for other fields/views; eg author, date etc return row; } 

而不是创build一个SimpleAdapter,现在创build一个CustomAdapter的实例,将它传递给实体对象的数组(或列表),并将整体设置为适配器到您的列表中:

 MyObject[] objects = ... setListAdapter(new ArrayAdapter<string>(this, R.layout.list_item, objects)); 

由于您现在直接处理对象,而不是首先从不同的字段中创build一串string表示,您还可以轻松访问每个项目的“id”。 更好的是,你可以添加很多不同的字段,而不用担心它在列表中的样子,因为可视化表示是由你在适配器的getView()方法中设置(而不是设置)的内容决定的。

我只想解释一下MH的答案。
getView函数的myArrayAdapter类中,您可以将您的ID分配给View (实际上是指“row”),如下所示:

 public View getView(int position, View convertView, ViewGroup parent){ View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(mItemLayout, null); } String[] dataForOneRow = this.allRowsData.get(position); // Tag is expected to be an Object (Integer is an object) // our data are in String array - that's why we need to convert it into Integer // I assume here, your ID number is first item (No.0) in the array of data v.setTag(new Integer( Integer.valueOf(dataForOneRow[0]) )); /* ...here you will set your data to display in your TextViews... */ return v; } 

然后,您需要知道用户点击该行时的行ID,一些详细的活动即将开始。

我有我的ListViewFragment ,这是从我的主要Activity ,从Fragment声明放在函数onCreateView代码Fragment

 // here we assign "onClick listener" when user clicks a row myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent myRowClickIntent = new Intent(getActivity(), myDetailActivity.class); // we can send some data to the new Activity through "extras" // remember - our Tag is an object (Integer object) but putExtra() awaits some integer or string or some other type // so here we are saying that it should be understood/treated as an Integer myRowClickIntent.putExtra("item_id", (Integer)view.getTag() ); startActivity(myRowClickIntent); } }); 

最后这里是我的DetailActivity的onCreate方法的一段代码:

 Bundle myExtras; int myItemId; myExtras = getIntent().getExtras(); if (myExtras != null) { myItemId = myExtras.getInteger("item_id"); } 

希望它有助于某人… 🙂
我也是Android新手。
非常thank you StackOverflow在学习Android开发方面的这种帮助:)