我编写了一个小应用程序,其中ListView
带有自定义适配器。每行包含一些Button
s,点击时会改变背景颜色,我也可以点击列表项目
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;
}
当进行另一项活动并回到此活动时,此功能正常。按钮按预期颜色创建。
所以我的猜测是,当单击一个项目时,列表是从原始listItem数组重新创建的,这就是为什么我试图通过重新加载我的数据库来解决这个问题,就像这样(来自我的活动):
@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
上重新加载或正确重新加载(即从数据库中)?
答案 0 :(得分:1)
您不必为每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:如果您将Model对象中的“数据库ID”保存为View
标记,则会更好。