2

我有一個GriView,裏面填充了項目,點擊gridview上的項目我將背景資源更改爲res文件夾中的圖像。我的問題是滾動和回到選定的項目,它不再有背景資源。相反,一些gridview的其他項目獲取背景。Gridview項目上滾動的背景資源

在我的onCreate方法,我有以下的代碼來填充我的GridView:

編輯基於我有我創建了一個自定義的適配器和填充gridview的建議。我現在的問題是,沒有我的GridView元素現在填充。當我設置適配器時,我傳遞一個布爾數組和一個數據數組。數據數組包含應該用於填充GridView的所有數據,並且布爾數組用於確定網格項是否已被選中。

編輯:即使在滾動之後,現在已選中的GridView元素也會高亮顯示,但現在其他從未被選中的元素似乎會突出顯示。

這裏是適配器類:

public class HoursAdapter extends BaseAdapter { 

    private Context mContext; 
    private boolean isSelected[]; 
    private String hours[]; 
    public HoursAdapter(Context c, boolean selected[], String hours[]){ 
     this.isSelected = selected; 
     this.mContext = c; 
     this.hours = hours; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return hours.length; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int arg0, View convertView, ViewGroup arg2) { 
     // TODO Auto-generated method stub 
     ViewHolder holder = null; 
     if(convertView==null){ 
      LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.hourview_item, null); 
      holder = new ViewHolder(); 
      holder.hours =(TextView) convertView.findViewById(R.id.hours_text); 
      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder)convertView.getTag(); 
     } 
     if(isSelected[arg0-1]) 
      holder.hours.setBackgroundResource(R.drawable.item_background_focused); 

     holder.hours.setText(hours[arg0-1]); 
     return convertView; 
    } 

    static class ViewHolder{ 
     TextView hours; 
    } 


} 

這我設立的適配器代碼:

HoursAdapter adapter = new HoursAdapter(this,isSelected,data); 


    hoursView.setAdapter(adapter); 

hoursView.setOnItemClickListener(new OnItemClickListener() { 


    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, 
      long id) { 
     // TODO Auto-generated method stub 
     v.setBackgroundResource(R.drawable.item_background_focused); 
    } 
}); 

我將不勝感激任何幫助!

回答

0

好像你並沒有考慮視圖回收在適配器中是如何工作的。在滾動過程中使用適配器視圖進行回收,即用於呈現剛剛單擊的項目的相同視圖應在滾動操作後重新用於呈現其他項目。

您應該定義您自己的適配器類並自己管理選定/未選擇的狀態(例如:使用一組與您的數據大小相同的布爾值)並通過BaseAdapter.getView(int, View, ViewGroup)正確設置/重置背景。這是一個非常基本的主題,你會得到大量的教程和參考Official Android Developers Portal

+0

所以每次我滾動視圖得到回收我猜。所以當我最初通過構造函數設置適配器時,我需要傳遞布爾數組嗎?因爲我認爲只有在最初設置gridview並使用項目填充它時才調用適配器類。 – AndroidDev93 2013-04-20 20:34:01

+0

只有從視口出來的視圖纔會被回收。該適配器被調用一次,是正確的,但你需要弄清楚它是如何工作的,以實現你想要的。例如http://developer.android.com/guide/topics/ui/layout/gridview.html涵蓋了關於這方面的基本信息。 – 2013-04-20 20:44:04

+0

我做了一些修改並創建了我自己的適配器。我讀到,我們必須創建自己的視圖持有者,並使用get/set標籤來跟蹤哪些項目具有背景資源。但是現在我的gridView中沒有任何項目被填充。我在上面的代碼中添加了更改。 – AndroidDev93 2013-04-20 21:05:09