DB 结果变成 ListView,数据可能不同

DB results into a ListView, data may vary

大家好,我是 java/android 编程新手,我正在尝试从数据库中填充列表视图。问题是每条记录的数据库输出可能有不同的结果。为了给你一个想法,我在列表视图的 xml 中有以下布局;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#a28d7a">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/coreHeader"
    android:textColor="#ffffff"
    android:padding="4dp" />
<LinearLayout
    android:id="@+id/coreLinear"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp">
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".5"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Small Text"
        android:id="@+id/coreStatsLeft"
        android:textColor="#ffffff" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".5"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Small Text"
        android:id="@+id/textView"
        android:textColor="#ffffff"
        android:textAlignment="textEnd"
        android:gravity="right" />
</LinearLayout>
</LinearLayout>

第一个 TextView 是 header 类型,更大的字体等。在此区域中,它将包含数据库中的两个字段,NAME 和 LEVEL,例如; SPIDER-MAN(等级 5)。

它下面的两个文本字段将保存统计数据,例如这个区域可以有多个;

Name                Value
------------------------------------
Armor                 10%
Speed                  5%
... and so on

每条记录可以不同,有些可能没有速度,有些可能没有装甲...也许这通过ListView做起来太难了,但我需要它可以搜索,我不知道还有什么其他选择我有空。

我的数据库字段如下:

ID、姓名、等级、统计数据

填充数据库的示例将显示为;

1, Spider-Man, 5, 3|10%;5|5%;6|3%

我创建了一个示例来展示如何向列表视图中的每一行添加变量数据。

这是 Activity 实现:

public class MainActivity extends AppCompatActivity
{
    private DynamicAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // Simulating variable data per row. Array Adapter instead Cursor Adapter for simplicity
        final DataRow[] data =
                {
                        new DataRow("Spider Man", new String[] {"3|10%", "5|25%"}),
                        new DataRow("Spider Man Brother", new String[] {"3|20%"}),
                        new DataRow("Other Spider Man", new String[] {"3|22%", "1|12%", "4|7%"})
            };

        // Assign data to adapter
        adapter = new DynamicAdapter(this, data);

        // Getting reference to ListView
        ListView listViewData = (ListView) findViewById(R.id.listViewData);

        // Setting adapter to listView
        listViewData.setAdapter(adapter);
    }
}

这是适配器为每一行放置数据的方式:

public class DynamicAdapter extends ArrayAdapter<DataRow>
{
    private final Context context;

    private final DataRow[] data;

    public DynamicAdapter(Context context, DataRow[] data)
    {
        super(context, R.layout.row_layout, data);

        this.context = context;

        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.row_layout, parent, false);

        // Get a listview reference
        LinearLayout linearLayoutRow = (LinearLayout) rowView.findViewById(R.id.coreLinear);

        if(position < data.length)
        {
            // Put text on header
            TextView textHeader = (TextView) rowView.findViewById(R.id.coreHeader);

            // Set the header for this row
            textHeader.setText(data[position].GetHeader());

            // Creating a vertical linear layout to put the data row
            LinearLayout linearLayoutData = new LinearLayout(context);
            linearLayoutData.setOrientation(LinearLayout.VERTICAL);

            // Get column amount for this row.
            int columnAmount = data[position].GetColumnsSize();

            for(int i = 0; i < columnAmount; i++)
            {
                // Creating dynamically a TextView for this column.                    
                TextView dynamicData = new TextView(context);

                dynamicData.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));

                // Adding data to TextView
                dynamicData.setText(data[position].GetDataAt(i));

                // Adding TextView to linearLayout
                linearLayoutData.addView(dynamicData);
            }

            // Adding LinearLayout to LinearLayout on XML  
            linearLayoutRow.addView(linearLayoutData);
        }

        return rowView;
    }
}

这是 Github 上的完整演示:https://github.com/deinier/DynamicDataOnListView

希望对您有所帮助。