2016-02-17 103 views
3

我寫了一個小應用程序,它帶有一個自定義適配器的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

您不必爲每個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標籤這是更好。

+0

This Works!它還提高了可維護性,因爲我現在擁有所有顏色。 ......但我不太瞭解PS,我應該在哪裏放置ID? – fifaltra

+0

您的*值*是什麼(項目類)的列表? – Rami

+1

啊,好的,當然這個item類存儲'DBid',但是我可以通過'onClick'方法訪問它,我把它放到標籤中。現在我想到了,把'i'放在那裏更有意義,這樣我就可以使用'values.get(i).getId()'來訪問它。我已經將標籤更改爲'long []'來傳遞'DBid' *和*'i',這當然毫無意義:D感謝您指引我朝着正確的方向發展! – fifaltra