gpt4 book ai didi

java - Android-ArrayAdapter : set TextView to value from SQLiteDatabase

转载 作者:行者123 更新时间:2023-12-02 05:36:53 25 4
gpt4 key购买 nike

我想要完成的事情:

我希望将 ListView 的每一行一个 TextView(其显示文本)动态设置为 SQLite 数据库中的值。

我尝试过的:

内部getView() ,我通过 findViewById() 分配了所述 TextView到一个全局变量。然后我分配了值position (从 getView() 的参数)到我的全局变量 mListRowPosition 。之后,我通过 new AttemptGetCustomerInfo().execute() 执行我的 AsyncTask 子类.

我的 AsyncTask 子类获得 SQLiteDatabase来 self 的DatabaseHelper 。随着mListRowPosition它收到 customer_id从方法getCustomerID() ArrayList<Service> 内的服务对象的数据集。

customer_id一起,它构建一个 SQL 查询来获取客户的简称。查询后得到字符串shortname从光标处。然后我setText(shortname)之前的全局 TextView(在 getView() 内)。

问题:

这种“工作方式”在某些时候,但似乎很慢,以至于只有最后一个(几乎每次)都有一个值设置为其文本。有时它也会出错。

调试日志记录后我看到getView()被调用的速度比 AsyncTask 完成的速度要快得多(这是有道理的,但它破坏了我的问题解决方案)。

也很有趣:我的调试日志告诉我 getView()被调用的频率比 ArrayList 内的数据条目更频繁。如果有5个条目,它将调用getView()约15至20次。为什么?

背后的代码:

public class ServiceAdapter extends ArrayAdapter<Service> {

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
Service service = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.listview_row, parent, false);
}
// Lookup view for data population
TextView quantity = (TextView) convertView
.findViewById(R.id.QUANTITY_CELL);
TextView description = (TextView) convertView
.findViewById(R.id.DESCRIPTION_CELL);
Button delete = (Button) convertView.findViewById(R.id.BUTTON_DELETE);
customerView = (TextView) convertView.findViewById(R.id.CUSTOMER_VIEW);
mListRowPosition = position;
Log.d("ServiceAdapter", "getView changed mListRowPositon to be "
+ String.valueOf(mListRowPosition));
new AttemptGetCustomerInfo().execute();

// Populate the data into the template view using the data object
quantity.setText(String.valueOf(service.getQuantity()));
description.setText(service.getDescription());

// Set up the listener for the delete button.

final int pos = position;
delete.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
showDialog("deleteButton", pos);
}
});

customerView.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
showDialog("customerView", pos);
}
});

// Return the completed view to render on screen
return convertView;
}


class AttemptGetCustomerInfo extends AsyncTask<String, String, String> {
String shortname = null;

@Override
protected String doInBackground(String... params) {

DatabaseHelper db_helper = new DatabaseHelper(context);
SQLiteDatabase db = db_helper.getReadableDatabase();

Log.d("AttemptGetCustomerInfo",
"ListRowPos: " + String.valueOf(mListRowPosition));
Log.d("AttemptGetCustomerInfo", "description of ListRowPos: "
+ services.get(mListRowPosition).getDescription());
int customer_id = services.get(mListRowPosition).getCustomerID();
Log.d("AttemptGetCustomerInfo",
"customer id: " + String.valueOf(customer_id));
Cursor c = db.rawQuery(
"SELECT " + CustomerEntry.COLUMN_NAME_SHORTNAME + " FROM "
+ CustomerEntry.TABLE_NAME + " WHERE "
+ CustomerEntry.COLUMN_NAME_CUSTOMER_ID + "="
+ customer_id, null);
Log.d("AttemptGetCustomerInfo",
"available cursor size" + String.valueOf(c.getCount()));
if (c.getCount() == 0) {
Log.d("AttemptGetCustomerInfo", "There are no Cursor entries!");
return null;
}
c.moveToFirst();
shortname = c
.getString(c
.getColumnIndexOrThrow(CustomerEntry.COLUMN_NAME_SHORTNAME));

db.close();

return null;
}

@Override
protected void onPostExecute(String s) {
if (shortname != null) {
customerView.setText(shortname);
}
}
}

其他信息:

我没有粘贴所有代码,并且上面的代码中发生了很多代码引用,而上面的代码中也没有代码。我希望我的未显示方法的功能可以通过方法名称来理解。

最佳答案

那么,让我们开始吧。

如果您想在Listview中显示数据库中的信息,我强烈建议您使用CursorAdapter而不是ArrayAdapter,它会工作得更快可能比现在更好。

关于getView()调用,发生这种情况是因为Android绘制listview的方式,第一次Android会多次调用getView()才能正常显示例如,如果您将 ListView 高度从 match_parent 更改为 wrap_content 或反之亦然,您会注意到您的 getView() 方法将被调用不同的次数。

<小时/>

现在关于您的代码,您没有正确编程您的 getView() 方法。在第一部分 if (convertView == null) 中,您应该使用 ViewHolder pattern 定义 View 。这将提高您的表现。

我在这里发现的另一个问题是,每次调用 getView() 方法时,都会启动 AsyncTask,这会导致 ListView 出现问题 滚动,因为它会妨碍顺利进行(例如,在平板电脑中,您将依次运行 40 或 50 个异步任务,这是一项繁重的工作负载)。

如果您想保留当前代码(我强烈建议您这样做),您将需要一种方法来控制当前行是否已执行您的 AsyncTask 代码,以便不重复那工作。

希望对你有帮助

关于java - Android-ArrayAdapter : set TextView to value from SQLiteDatabase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24884587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com