gpt4 book ai didi

java - 无法获取要从数据库重新加载的列表项

转载 作者:太空狗 更新时间:2023-10-29 14:01:11 27 4
gpt4 key购买 nike

我写了一个小应用程序,它有一个带有自定义适配器的 ListView。每行包含一些 Button,点击时会改变背景颜色,我通过放置

使列表项也可以点击
android:descendantFocusability="blocksDescendants"

在列表项的 xml 中。但现在我有一个奇怪的错误,点击列表项会将所有点击的 Button 恢复到它们原来的无色状态。如何让 Button 保持颜色?

详细信息:

部分自定义适配器:

View.OnClickListener onButtonClicked = new View.OnClickListener() {
@Override
public void onClick(View button) {
View listItem = (View) button.getParent();
final long DBid = (long) listItem.getTag();//database ID

final Button b = (Button) button;

sqldataDataSource datasource = new sqldataDataSource(context);
datasource.open();
datasource.updateButton(DBid);
datasource.close();
b.setBackgroundColor(0xFF386F00);

}
};

如您所见,我更改了背景颜色并更改了数据库条目,因此当重新加载整个列表时,Button 保持其颜色(我的自定义适配器的另一部分):

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

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

Button b = (Button) rowView.findViewById(R.id.HRlistB);
b.setOnClickListener(onButtonClicked);

if(!(values.get(i).getB().equals(""))){
b.setBackgroundColor(0xFF386F00);
}
return rowView;
}

这在转到另一个 Activity 并返回到这个 Activity 时效果很好。按钮按预期颜色创建。

所以我的猜测是当一个项目被点击时,列表是从原始的 listItem 数组重新创建的,这就是为什么我试图通过重新加载我的数据库来解决这个问题,就像这样(从我的 Activity 中):

@Override
protected void onStart() {
super.onStart();

datasource = new sqldataDataSource(this);
datasource.open();

listItems = datasource.getOnlyRoutes(id);//this works fine
Collections.sort(listItems, HallenRoute.vergleichen());

if (mListView == null) {
mListView = (ListView) findViewById(R.id.listViewHalle);
}
adapter=new customAdapter(this, listItems);
setListAdapter(adapter);

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int pos, long nid) {
listItems.get(pos).increaseCount();
datasource.updateCountHR(listItems.get(pos));
listItems = datasource.getOnlyRoutes(id);//fix I tried, doesn't work
Collections.sort(listItems, HallenRoute.vergleichen());
adapter.notifyDataSetChanged();
}
});

}

但这行不通。

如何让 ListView 不在 ItemClick 上重新加载或正确重新加载(即从数据库)?

最佳答案

您不必为每次点击 Button 重新加载整个数据。

在您的 Button 中单击您只是在更新数据库,而不是您的适配器数据集 values,这就是您总是获得旧背景颜色的原因。

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

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

Button b = (Button) rowView.findViewById(R.id.HRlistB);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View button) {
View listItem = (View) button.getParent();
final long DBid = (long) listItem.getTag();//database ID

final Button b = (Button) button;

sqldataDataSource datasource = new sqldataDataSource(context);
datasource.open();
datasource.updateButton(DBid);
datasource.close();
//b.setBackgroundColor(0xFF386F00); no need for this line, getView() method will take care of the background
//update your adapter dataset, eg: values.get(i).setB("newColor");
notifyDataSetChanged(); // to refresh your adapter

}
});

if(!(values.get(i).getB().equals(""))){
b.setBackgroundColor(0xFF386F00);
}
return rowView;
}

PS:最好将“数据库 ID”保存在模型对象中,而不是作为 View 标记。

关于java - 无法获取要从数据库重新加载的列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35469246/

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