Android Studio,如何使用数组或光标中的数据填充自定义 ListView?

Posted

技术标签:

【中文标题】Android Studio,如何使用数组或光标中的数据填充自定义 ListView?【英文标题】:Android Studio, How can I fill a custom ListView with data from an array or cursor? 【发布时间】:2015-12-24 14:07:42 【问题描述】:

所以我有一个看起来像这样的片段视图:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
tools:context=".MainActivityFragment"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true">

    //Various elements

    <ListView
        android:layout_
        android:layout_
        android:id="@+id/notes_list_view"
        android:drawSelectorOnTop="false">

    </ListView>

</LinearLayout>

所以列表视图位于一组元素的底部。我一直在试图弄清楚如何在这个列表视图中填充项目,但无论我尝试什么,我都无法在数组中出现任何内容,每次都是空的。理想情况下,我想填充如下所示的项目视图:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal">

<FrameLayout
    android:layout_
    android:layout_>

    <ImageView
        android:id="@+id/list_item_icon"
        android:layout_gravity="center"
        android:layout_
        android:layout_/>

</FrameLayout>

<LinearLayout
    android:layout_
    android:layout_
    android:layout_weight="7"
    android:orientation="vertical">

    <TextView
        android:id="@+id/list_item_1_textview"
        android:layout_
        android:layout_
        android:fontFamily="sans-serif-condensed"
        android:textSize="20sp"/>

    <TextView
        android:id="@+id/list_item_2_textview"
        android:layout_
        android:layout_
        android:fontFamily="sans-serif-condensed"
        android:textAppearance="?android:textAppearanceSmall"/>
</LinearLayout>

<LinearLayout
    android:layout_
    android:layout_
    android:layout_weight="5"
    android:layout_gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/list_item_3_textview"
        android:layout_
        android:layout_
        android:layout_gravity="center"
        android:fontFamily="sans-serif-condensed"
        android:textAppearance="?android:textAppearanceLarge"/>

    <TextView
        android:id="@+id/list_item_4_textview"
        android:layout_
        android:layout_
        android:layout_gravity="center"
        android:fontFamily="sans-serif-condensed"
        android:textAppearance="?android:textAppearanceSmall"/>
</LinearLayout>
</LinearLayout>

谁能帮我写一个 ArrayAdapter 或 CursorAdapter 来让某些东西出现,我可以稍后对其进行调整,因为数据最终将来自数据库,所以我打算这样做。

或者,有人可以找到导致什么都不显示的原因吗?我在 UI 设计方面没有经验,我担心我只是将列表视图的空间挡住了。

作为参考,我使用的最小 SDK 为 11。

【问题讨论】:

使用SimpleCursorAdapter,除了适配器的构造函数(也不需要遍历数据库Cursor),您不需要编写任何东西,请不要使用@ 987654325@ 就像您接受的答案一样,如果您的数据来自 sqlite db,这不是您应该遵循的方式 【参考方案1】:

声明一个数据传输类来存储填充所需的值

public class Item

 public string text1,text2,text3,text4;
 public byte[] image;

将 Db 中的值设置为 ItemArrayList,然后在 Adpater 中使用 DataDto 填充视图,如

    public class ListAdapter extends ArrayAdapter<Item> 

     ArrayList<Item> p;
        public ListAdapter(Context ArrayList<Item> items) 
            super(context, R.layout.list_item, items);
            p=items;
        

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 

            View v = convertView;

            if (v == null) 
                LayoutInflater vi;
                vi = LayoutInflater.from(getContext());
                v = vi.inflate(R.layout.list_item, null);
            



            if (p != null) 
                TextView tt1 = (TextView) v.findViewById(R.id.list_item_1_textview);
                TextView tt2 = (TextView) v.findViewById(R.id.list_item_2_textview);
                TextView tt3 = (TextView) v.findViewById(R.id.list_item_3_textview);
                TextView tt4 = (TextView) v.findViewById(R.id.list_item_4_textview);
                ImageView img=(ImageView)
v.findViewById(R.id.list_item_icon);
                if (tt1 != null) 
                    tt1.setText(p.get(position).text1);
                

                if (tt2 != null) 
                    tt2.setText(p.get(position).text4);
                

                if (tt3 != null) 
                    tt3.setText(p.get(position).text3);
                
                if (tt4 != null) 
                    tt1.setText(p.get(position).text4);
                
               if(img!=null)
               
                byte[] bitmapdata =p.get(position).image;
                Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata , 0, bitmapdata .length);
                  img.setimageBitmap(bitmap);
               

            

            return v;
        

    

在您的 Activity 中,填充 ArrayList 并将其传递给 Adapter,如下所示

ListView lv=(ListView)findViewById(R.id.notes_list_view);
ArrayList<Item> items; populate this list from DB
ListAdpater data=new ListAdapter(this,items);
lv.setAdapter(data);

【讨论】:

以上是关于Android Studio,如何使用数组或光标中的数据填充自定义 ListView?的主要内容,如果未能解决你的问题,请参考以下文章

如何使回车键将光标移动到 Android Studio 中的行尾,就像在 Eclipse 中一样

如何在 Android 中使用光标数据创建列表数组

Android Studio中的多行编辑[重复]

使用单个元素 android studio 获取 Json 数组

Android Studio 鼠标滚动设置字体大小

Android Studio 鼠标滚动设置字体大小