无法从数据库重新加载listitems

时间:2016-02-17 22:43:00

标签: java android sqlite listview

我编写了一个小应用程序,其中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上重新加载或正确重新加载(即从数据库中)?

1 个答案:

答案 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标记,则会更好。