2015-07-21 140 views
0

Accualy我閱讀所有帖子,但我無法解決我的問題。我需要幫助。當GridView滾動時,它會更改複選框選擇

我有gridview。我正在填充網格基礎適配器。我的網格有ImageViews和CheckBoxes。我正在打開任何網格並檢查CheckBox。一切都在這裏完成。

但是,當我滾動gridview所有選擇變化。我嘗試從其他帖子的一些解決方案,但我無法修復問題。

適配器GetView方法;

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    View grid; 

    if (convertView == null) { 
     grid = new View(mContext); 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     grid = inflater.inflate(R.layout.mygrid, parent, false); 
    } else 
    { 
     grid = (View) convertView; 
    } 

    ImageView imageView = (ImageView) grid.findViewById(R.id.imagepart); 
    final CheckBox ch = (CheckBox)grid.findViewById(R.id.checkBox); 
    ch.setTag(position); 

    HashMap<String,String> tar; 
    tar = data.get(position); 

    imageLoader.DisplayImage(tar.get(FragmentB.FOTOYOL),imageView); 

    grid.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      CheckBox chh = (CheckBox)v.findViewWithTag(position); 
      chh.setChecked(true); 
      return false; 
     } 
    }); 

    return grid; 
} 

如果我刪除(convertView == NULL)線和刪除其他塊,然後,檢查不改變,但是當複選框會看不見,因爲滾動,帶滾動返回到該複選框,並沒有選中。沒有永久檢查。

我需要很大的幫助。謝謝...

回答

0

您需要保持與您的支持數據的檢查狀態,而不是(僅)在視圖中。這意味着,OnLongClickListener具有將項目添加到tar地圖:

tar.put("checked", "true"); 

getView(…)方法(雙擊聽者外)需要初始化從該數據的複選框:

String checked = tar.get("checked"); 
grid.findViewWithTag(position).setChecked(
     checked != null && Boolean.getBoolean(checked) 
    ); 

注:您必須聲明tarfinal,因爲它在偵聽器內可以訪問。

+0

你能解釋一下嗎?抱歉。 –

+0

GridView旨在重用視圖以提高效率。例如,您可能有100項數據,但只有10個視圖可以放在屏幕上。如果顯示數據項1的視圖在頂部的屏幕上滾動,那麼該視圖將移動到底部,併成爲項目11的「convertView」。項目1的所有數據仍然存在,因此您必須覆蓋*全部*它顯示數據11正確(即你必須清除複選框)。當您向另一個方向滾動時,您希望複選框的設置與滾動前相同,這就是爲什麼您必須跟蹤數據本身中的已檢查狀態。 – Barend

+0

謝謝,但我不能正確應用你的代碼。我僅使用tar圖像來顯示圖像。我必須在clicklistener內部分配一個新的「tar地圖」嗎?你能更新我的代碼嗎?我很久沒有打過這個東西..我真的很抱歉,因爲你更累了.. –

0

我在Barend的幫助下找到了解決方案;

我改變了這樣的getview方法;

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     View grid; 

      grid = new View(mContext); 
      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      grid = inflater.inflate(R.layout.mygrid, parent, false); 

     ImageView imageView = (ImageView) grid.findViewById(R.id.imagepart); 
     final CheckBox ch = (CheckBox)grid.findViewById(R.id.checkBox); 
     ch.setTag(position); 

     final HashMap<String,String> tar; 
     tar = data.get(position); 

     imageLoader.DisplayImage(tar.get(FragmentB.FOTOYOL), imageView); 

     String checked = tar.get("checked"); 
     if (checked == "true") 
     { 
      CheckBox hh = (CheckBox)grid.findViewWithTag(position); 
        hh.setChecked(true); 
     } 
     else if (checked == "false") 
     { 
      CheckBox hh = (CheckBox)grid.findViewWithTag(position); 
      hh.setChecked(false); 
     } 

     grid.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       CheckBox chh = (CheckBox)v.findViewWithTag(position); 
       if (chh.isChecked()) 
       { 
        chh.setChecked(false); 
        tar.put("checked","false"); 
       } 
       else 
       { 
        chh.setChecked(true); 
        tar.put("checked", "true"); 
       } 
       return true; 
      } 
     }); 

     return grid; 
    } 
相關問題