Java 无法从数据库获取要重新加载的listitems

Java 无法从数据库获取要重新加载的listitems,java,android,sqlite,listview,Java,Android,Sqlite,Listview,我编写了一个小应用程序,它有一个带有自定义适配器的ListView。每一行都包含一些按钮s,单击这些按钮时背景颜色会发生变化,我通过将 android:descendantFocusability="blocksDescendants" 在列表项的xml中。但是现在我有一个奇怪的错误,点击列表项会将所有点击的按钮恢复到原来的无色状态。如何使按钮保持其颜色 详情: 自定义适配器的一部分: View.OnClickListener onButtonClicked = new View.OnClic

我编写了一个小应用程序,它有一个带有自定义适配器的
ListView
。每一行都包含一些
按钮
s,单击这些按钮时背景颜色会发生变化,我通过将

android:descendantFocusability="blocksDescendants"
在列表项的xml中。但是现在我有一个奇怪的错误,点击列表项会将所有点击的
按钮恢复到原来的无色状态。如何使
按钮保持其颜色

详情:

自定义适配器的一部分:

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);

    }
};
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数组重新创建的,这就是为什么我试图通过重新加载数据库来修复此问题,就像这样(从我的活动中):

@覆盖
受保护的void onStart(){
super.onStart();
datasource=新的sqldataDataSource(此);
datasource.open();
listItems=datasource.getOnlyRoutes(id);//这很好用
Collections.sort(listItems,HallenRoute.vergleichen());
if(mListView==null){
mListView=(ListView)findViewById(R.id.listViewHalle);
}
adapter=新的customAdapter(此为listItems);
setListAdapter(适配器);
mListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长nid){
listItems.get(pos.increaseCount();
datasource.updateCountHR(listItems.get(pos));
listItems=datasource.getOnlyRoutes(id);//我尝试过的修复方法无效
Collections.sort(listItems,HallenRoute.vergleichen());
adapter.notifyDataSetChanged();
}
});
}
但这不起作用


如何使
列表视图
不重新加载
项单击
或正确重新加载(即从数据库中加载)?

您不必为每个
按钮
单击重新加载整个数据

按钮中
单击,您只是在更新数据库,而不是适配器数据集
,这就是为什么总是使用旧的背景色

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”保存在模型对象中,而不是保存为
视图
标记。

这很有效!它还提高了可维护性,因为我现在把所有颜色都放在一个地方了。。。但是我真的不理解PS,我应该把id放在哪里?你的值是什么(item类)的列表?啊,好的,item类当然存储了
DBid
,但是为了能够在
onClick
方法中访问它,我把它放在标记中。现在我想了想,把
I
放在那里更有意义,这样我就可以使用
values.get(I).getId()
来访问它。我已将标记更改为a
long[]
以传递
DBid
I
,这当然毫无意义:D感谢您为我指明了正确的方向!
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;
}