2013-04-30 67 views
0

我有一個自定義ListViewbutton,所以當我點擊一個button它應該消失,它正在消失,但當我向下滾動並回來button再次出現和不同button正在消失。我怎樣才能使具體button上點擊消失....我使用此代碼如何在自定義ListView中設置按鈕的可見性?

holder.checkbox = (Button) view.findViewById(R.id.checkBox1); 

holder.checkbox.setOnClickListener(new View.OnClickListener() { 

@Override 
public void onClick(View v) { 
    holder.checkbox.setVisibility(View.INVISIBLE); 
+0

你有你的解決方案?如果你從答案中得到答案,那麼接受它,否則發佈你的答案。如果你接受答案,這將有助於他人和你的聲望也會增加。 – Ankit 2013-05-01 05:09:36

+0

我會defenitely,但我dint得到一個很好的解決方案可能是所有的答案的作品,但我無法弄清楚哪個打勾... – Saad 2013-05-01 07:22:43

回答

2

ListView中,當一個項目超出屏幕的,爲了提高效率ListView銷燬項目,當滾動回該項目時,它通過調用適配器的getView()方法重新創建它,所以你必須保持一個數組有一個布爾值的按鈕的狀態,默認情況下將是可見的和在getView()您只需通過從布爾數組中獲取狀態的布爾值來進行檢查,如果爲true,則item可見,否則item不可見。所以當你消失一件物品時,你必須設置物品的狀態也是假的。 我認爲這是您的getView()中的代碼,並且您已經定義了與ListView的項目和名稱爲「yourButtonStatusBooleanArray」的值的值相同的布爾數組,然後進行以下修改將適用於您。

holder.checkbox = (Button) view.findViewById(R.id.checkBox1); 

if(!yourButtonStatusBooleanArray[position]) 
{ 
holder.checkbox.setVisibility(View.INVISIBLE); 
} 
holder.checkbox.setOnClickListener(new View.OnClickListener() { 

@Override 
public void onClick(View v) { 
holder.checkbox.setVisibility(View.INVISIBLE); 
yourButtonStatusBooleanArray[position]=false; 
+0

我該怎麼做?? ?? sry即時新編程... – Saad 2013-04-30 08:19:09

+0

我編輯了我的答案..請檢查代碼 – 2013-04-30 08:23:35

+0

你的意思是「布爾yourButtonStatusBooleanArray = true」? – Saad 2013-04-30 09:58:04

1

嘗試按鈕聲明之後加入holder.checkbox.setVisibility(View.VISIBLE);

+0

這是有點工作,但是當我向下滾動並回來按鈕,我點擊是再次出現... – Saad 2013-04-30 08:14:07

+0

這是因爲ListView重用資源。試試看這個答案,他們給了我一個類似的問題:http://stackoverflow.com/a/15900881/1006156 – Mangusto 2013-04-30 08:18:53

1

這是因爲視圖回收而發生的。你需要做的是維護一個布爾數組,每次單擊一個按鈕切換相應的布爾值。然後在你的getview中檢查相應的布爾數組位置並設置按鈕的狀態。

更多細節reffer此鏈接

check box in listview not working properly

上面的例子是複選框,編輯你的代碼。

+0

我沒有複選框,即時通訊有一個按鈕,所以這仍然工作? – Saad 2013-04-30 08:22:35

+0

是。你只需要檢查點擊按鈕的狀態。它不是問題,而是它是複選框或按鈕 – 2013-04-30 08:23:54

+0

只是在您的代碼中添加行,在該鏈接中標記爲「新」 – 2013-04-30 08:25:07

1

問題是行的視圖被重用,因此在滾動行視圖之後可能會顯示具有不同行狀態的按鈕。您可以通過在初始化視圖時明確設置按鈕的可見性來解決此問題。所以你必須記住某一行的狀態在您的數據對象或數組中跟蹤已經選擇的項目。

holder.checkbox.setVisibility(dataObject.getVisibilityState()); 

編輯答案進行評論,這裏顯示有代碼塊

你必須自己實現的方法,代碼是如何被使用的自定義方法只是一個例子。所以,你可以做這樣的事情在你的物品類別:

public class Item { 
private int visibility; 
... other attributes of your item 

public int getVisibilityState(){ 
    return visibility; 
} 

public void setVisible(){ 
    visibility = View.VISIBLE; 
} 

public void setInvisible(){ 
    visibility = View.INVISIBLE; 
} 
} 
+0

我收到一個錯誤「方法getVisibilityState()未定義的類型列表」 – Saad 2013-04-30 09:55:28

+0

你必須自己實現Method,代碼只是一個例子,可以使用自定義方法。所以你可以在你的項目中做類似這樣的項目Class: 'public class Item {0} {0} {0}私人詮釋能見度; ...您商品的其他屬性 public int getVisibilityState(){ return visibility; } public void setVisible(){ visibility = View.VISIBLE; } public void setInvisible(){ visibility = View.INVISIBLE; } }' – Sven 2013-04-30 11:34:36

1

你需要實現你的ListAdapter這種方法被稱爲每次你行觀去,從屏幕外屏幕上,由於時間用戶滾動列表。傳遞給你的getView方法的View可能實際上被用來顯示完全不同行的數據。這是因爲對象被回收 - 如果您有1,000行的數據,但只有8個視圖適合屏幕顯示,則系統會爲您的行創建8個View對象,而不是1,000。

如果你的類實現ListAdapter你可以重寫getView方法如下:

public class MyClass implements ListAdapter { 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

View rowView = convertView; 

//Create a view for this row if none exists yet 
if (rowView == null) { 
    LayoutInflater inflater = (LayoutInflater) _context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    rowView = inflater.inflate(R.layout.YOUR_ROW_LAYOUT, parent, false); 

//make the button go away if it should not be visible 
if (buttonShouldBeNotVisible(convertView)) { //Your code should determine this 
    convertView.checkbox.setVisibility(View.INVISIBLE); 
    //Use View.GONE to make it take up no space 
} 
return convertView 

}}

1

的意見在ListView回收。您必須以某種數據結構保存按鈕的狀態,並將其設置在適配器getView(int, View, ViewGroup)中。

private HashMap<Integer, Boolean> mButtonMap = new HashMap<Integer, Boolean>(); 

[...] 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View retVal; 

    // Do all your stuff with each row 



    if (!mButtonMap.containsKey(new Integer(position))) { 
     button.setVisibility(View.VISIBLE); 
    } 
    else { 
     button.setVisibility(View.INVISIBLE); 
    } 
    button.setTag(""+position); 
    return retVal; 
} 

//In your onClickListener 
    onClick(View v) { 
     [...] 
     int position = Integer.parseInt((String) v.getTag()); 
     mButtonMap.put(position, true); 
     button.setVisibility(View.INVISIBLE); 
    } 
+0

有一個小錯誤「方法Integer(int)未定義類型ListRowAdapter」,我該如何解決這個問題? – Saad 2013-04-30 08:45:20

+0

可能是錯過了'新'。我已經更新了答案。 – mach 2013-04-30 09:07:59

+0

04-30 09:14:44.463:E/AndroidRuntime(4214):java.lang.ClassCastException:java.lang.Integer不能轉換爲java.lang.String 04-30 09:14:44.463:E/AndroidRuntime (4214):\t at com.envesage.ListRowAdapter $ 1.onClick(ListRowAdapter.java:341) – Saad 2013-04-30 09:28:38

1

你可以做這樣的事情:

public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     ViewHolder holder; 
     if (convertView == null) { 
      vi = inflater.inflate(R.layout.grid_adapter, null); 
      holder = new ViewHolder(); 
      holder.checkbox = (Button) view.findViewById(R.id.checkBox1); 
      holder.checkbox.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 
        if (arg0.getTag().equals("0")) { 
         arg0.setVisibility(View.INVISIBLE); 
         arg0.setTag("1"); 
        } 
        notifyDataSetChanged(); 
       } 
      }); 

      vi.setTag(holder); 
     } else 
      holder = (ViewHolder)vi.getTag(); 

     try { 

      if (holder.checkbox.getTag().equals("1")) { 
       holder.checkbox.setVisibility(View.INVISIBLE); 
      } else { 
       holder.checkbox.setVisibility(View.VISIBLE); 
      } 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return vi; 
    } 
相關問題