你如何手动手动编写Android ListView?

时间:2011-11-10 03:47:04

标签: android

我需要创建一个非常小的ListView。每行可以在右侧浮动不同的元素。例如,顶行将有一个复选框,最后一行将有一个显示箭头。它与“设置”应用程序具有的ListView非常相似,其中每行都有不同的附件。

Row 1     []
-------------
Row 2    123
-------------
Row 3    abc
-------------
Row 4      >

我认为我不能使用ListAdapter,因为它强制行是同质的。而且由于我只有4行,所以我宁愿手动为每行写入XML。我无法找出ListViews的子行被调用的内容。在iPhone上,UITableViewCell是UITableView的子代。在Android上,我没有找到这样的ListViewCell或ListViewRow。

6 个答案:

答案 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
            ..
     }
 }
相关问题