我需要创建一个非常小的ListView。每行可以在右侧浮动不同的元素。例如,顶行将有一个复选框,最后一行将有一个显示箭头。它与“设置”应用程序具有的ListView非常相似,其中每行都有不同的附件。
Row 1 []
-------------
Row 2 123
-------------
Row 3 abc
-------------
Row 4 >
我认为我不能使用ListAdapter,因为它强制行是同质的。而且由于我只有4行,所以我宁愿手动为每行写入XML。我无法找出ListViews的子行被调用的内容。在iPhone上,UITableViewCell是UITableView的子代。在Android上,我没有找到这样的ListViewCell或ListViewRow。
答案 0 :(得分:1)
看一下TableLayout。这听起来像你在寻找:
如果需要,您甚至可以将其包装在ScrollView中。
此外,可以为ListView的不同行创建不同的视图,但考虑到当前的需要,静态布局似乎更有意义。
答案 1 :(得分:1)
ListAdapter不要求行是同质的。您只需实施getView
即可返回视图,getItemViewType
可为每种不同类型的行返回不同的int
。
答案 2 :(得分:1)
在Android中,有许多布局元素(视图)可以任意嵌套。 Android视图不一定与IPhone UI元素1对1对应,但您当然可以获得所需的功能。 Hello Views可能是您想要了解可用的视图和布局的地方。
您可能正在寻找的布局是LinearLayout(垂直)。在线性布局中,您可以包含任何其他子视图,包括您定义的其他布局。
另一种实现方法是使用自定义ListAdapter切换正在呈现的项类型,并选择要使用的相应组件(复选框,按钮,图像等等)。但是,除非您要渲染一些项目集合,或者光标中包含这些项目,否则Listview是一个使用IMO的不自然的视图。虽然ListView可以支持非同类项,但它通常不是解决此特定问题的正确工具。
答案 3 :(得分:1)
TableLayout可以解决这个问题,但有点像直接在Java中使用GridBagLayout ......有点过分。
我使用自定义ExpandedListAdapter完成了非常类似的操作。你正在寻找的东西就是使用ArrayAdapter并覆盖getView。正如Android的javadoc所说"要使用TextViews以外的东西进行数组显示,例如ImageViews,或者除了toString()之外还有一些数据填充视图,覆盖getView(int,View,ViewGroup)返回你想要的视图类型。"
我在我的代码中使用的技巧是让膨胀的视图根据数据而有所不同,你可以为右手内容做类似的事情。我膨胀的视图是一个水平线性布局,只有一些差异取决于数据类型。应该适用于您描述的用例。
如果您已准备好为整个事物编写XML布局,我认为稍后会咬你,然后使用ListView和ListViewItem元素(请参阅下面的最后一个链接以获取示例)。
一些帮助链接是:
http://sudarmuthu.com/blog/using-arrayadapter-and-listview-in-android-applications http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/
http://danroundhill.com/2009/12/18/working-with-the-android-listview/
答案 4 :(得分:0)
您可以使用TableLayout ..
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TableRow>
<Button
android:id="@+id/backbutton"
android:text="Back"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:layout_height="2dip"
android:background="#FF909090" />//this view will help you to draw line so table layout will look like listview
</TableRow>
<TableRow>
<TextView
android:text="First Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1" />
<EditText
android:width="100px"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:layout_height="2dip"
android:background="#FF909090" />
</TableRow>
<TableRow>
<TextView
android:text="Last Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1" />
<EditText
android:width="100px"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:layout_height="2dip"
android:background="#FF909090" />
</TableRow>
您可以使用复选框等组件代替EditText。使用相应复选框的id,你可以根据你的情况执行...我觉得它可以帮到你..
答案 5 :(得分:0)
创建自定义ListFragment或ListActivity。 创建一个自定义适配器,它可以返回一个视图,该视图根据条件的行号动态填充。 R&gt; id.list_item可以包含动态填充的视图
public class MyFragment extends ListFragment {
private ContactAdapter mAdapter;
public MyFragment() {}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mInflater = (LayoutInflater)
getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
mAdapter = new ContactAdapter(getActivity(),
R.layout.list_item,R.id.key, contactItemList);
mAdapter .setInflater(mInflater);
mAdapter.setLayout(R.layout.list_item);
setListAdapter(mAdapter );
}
}
class ContactAdapter extends ArrayAdapter<ContactItem> {
private static String TAG = EfficientAdapter.class.getName();
private LayoutInflater inflator = null;
List<ContactItem> pairList = null;
private int layout;
public ContactAdapter(Context context, int resource,
int textViewResourceId, List<ContactItem> objects) {
super(context, resource, textViewResourceId, objects);
….
}
/**
* Make a view to hold each row.
*
* @see android.widget.ListAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
public View getView(final int position, View convertView,
ViewGroup parent) {
return a custom convertView
..
}
}