【问题标题】:Casting list to listview that was generated from SQLite将列表转换为从 SQLite 生成的列表视图
【发布时间】:2017-05-13 10:12:29
【问题描述】:

快速信息

我正在关注 Lynda.com 上名为“使用本地存储进行应用程序开发”的示例视频。我有练习文件,但我正在尝试使用自己的设置进行练习。

数据库设置

正在创建一个数据库,然后使用Cursor 对象将所有数据填充到DataItem 元素的List 接口。 DataItem 是实现Parcelable 的模型类,用于使用setter 和getter 对SQL 数据进行建模。这是我对可能是问题原因的类的有限理解。

当前设置

我从标准导航抽屉创建了一个新活动,并尝试将数据库(正在正确创建和测试)显示到位于content_main.xmllist_view

问题

我的问题在于不知道在 ArrayAdapter 中包含的确切内容。

listFromDB = maSource.getAllItems();
ArrayAdapter<String> arrayAdapter;

arrayAdapter = new ArrayAdapter<String>
               (this,android.R.layout.simple_list_item_1, **?listFromDB?**); 

ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(arrayAdapter);

正如我所提到的,listFromDB 是包含数据库的列表类型。将其输出到 logcat 将导致 4 列和 2 行。

12-29 00:36:40.977 6326-6326/? D/数据库信息: [数据项{accountId='6d8bb011-bd9a-4c71-b4c7-2ddaa5fe6fce', accountName='第 1 行',description='关于第 1 行的信息',余额=1903.59}, 数据项{accountId='b6d08c68-d41d-4821-b901-23e7f38cebd9', accountName='Row 2', description='Info About Row 2', balance=41.28}]

[12-29 00:36:41.097 6326:6326 日/]

HostConnection::get() 新主机连接建立 0xb7aba1b0, tid 6326

【问题讨论】:

  • 你必须创建自定义适配器来显示列表数据

标签: java android sqlite android-studio


【解决方案1】:

感谢@Divyesh,我找到了解决问题的方法。


创建一个自定义的 ArrayAdapter 就可以了:

  1. 创建额外的布局视图以包含所需的小部件。在我的情况下,data_view.xml 下创建了 3 个 TextView
  2. 创建了一个列表解析器以从数据库中找到的每一行中提取数据,并将其构造为DataItemlistFromDB
  3. 然后定义自定义适配器,扩展 ArrayAdapter 并在 data_view.xml 膨胀后将值分配给 TextViews。
  4. 最后,MainActivity 中使用了新的自定义适配器,并将列表中的项目分配给适当的 TextViews

以下是上述步骤的示例,稍后我将对其进行重构。

data_view.xml

<TextView
    android:id="@+id/accountName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Account Name" />
<TextView
    android:id="@+id/description"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Description" />
<TextView
    android:id="@+id/balance"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Balance" />

列表解析器

public class ListParser {
    public String accountName;
    public String description;
    public String balance;

    public ListParser(String accountName, String description, String balance) {
        this.accountName = accountName;
        this.description = description;
        this.balance = balance;
    }
}

自定义适配器

public class AccountAdapter extends ArrayAdapter<ListParser> {
    public AccountAdapter(Context context, ArrayList<ListParser> users) {
        super(context, 0, users);
    }

    public static class ViewHolder {
        TextView accountName;
        TextView description;
        TextView balance;

        public ViewHolder(View convertView) {
             accountName = (TextView) convertView.findViewById(R.id.accountName);
             description = (TextView) convertView.findViewById(R.id.description);
             balance = (TextView) convertView.findViewById(R.id.balance);
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        ListParser user = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.account_view, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)convertView.getTag();
        }

        // Lookup view for data population
        TextView accountName = viewHolder.accountName;
        TextView description = viewHolder.description;
        TextView balance = viewHolder.balance;
        // Populate the data into the template view using the data object
        accountName.setText(user.accountName);
        description.setText(user.description);
        balance.setText(user.balance);
        // Return the completed view to render on screen
        return convertView;
    }
}

MainActivity(单行)

ArrayList<ListParser> arrayOfListParsers = new ArrayList<ListParser>();
AccountAdapter adapter = new AccountAdapter(this, arrayOfListParsers);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);

ListParser newUser = new ListParser(String.valueOf(listFromDB.get(0).getaccountName()), String.valueOf(listFromDB.get(0).getDescription()), String.valueOf(listFromDB.get(0).getBalance()));
adapter.add(newUser);

MainActivity 类需要做更多的工作,但这只是一次试运行。

附加信用:https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView

【讨论】:

  • 您应该考虑使用ViewHolder Pattern,这样您就不会为每个getView() 调用进行视图查找。我将它添加到代码中。
  • @EpicPandaForce 我继续将我的适配器更新为 View Holder 并准备更新我的答案,然后我意识到你已经完成了。谢谢。
  • @EpicPandaForce 我们有同样的事情,只是你添加了public ViewHolder(View view){...} 导致counterView 无法被识别。
  • 只是IntelliJ指出无法解析变量,我没有运行之前出现错误的代码。我会在回家后更新最近的编辑。
  • 那行得通。我还没有在真实设备上测试过它,但即使在模拟器上它也快得多。感谢您提及View Holder
猜你喜欢
  • 2017-05-13
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多