【发布时间】:2016-05-29 21:32:42
【问题描述】:
我编写了一个小应用程序,它有一个带有自定义适配器的ListView。每行包含一些Buttons,单击时会更改背景颜色,并且我通过放置
android:descendantFocusability="blocksDescendants"
在列表项的 xml 中。但是现在我有一个奇怪的错误,点击列表项会将所有点击的Buttons 恢复到原来的无色状态。如何让Buttons 保持颜色?
详情:
部分自定义适配器:
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 上不重新加载或正确重新加载(即从数据库)?
【问题讨论】:
标签: java android sqlite listview