2013-03-14 30 views
3

我有listview與arrayadapter。我希望點擊列表項目中的某個按鈕時,該項目中的特定視圖(而不是其他項目)可見或不可見。Android設置視圖內部ListAdapter的可見性

繼承人我在適配器getView正在做的代碼()方法:

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

    if (convertView == null) { 

     convertView = vi.inflate(layoutResourceId, null, false); 
     holder = new Holder(); 
     holder.setShare((ImageView) convertView.findViewById(R.id.share)); 
     holder.setShareButtons((LinearLayout)convertView.findViewById(R.id.shareButtons)); 
     convertView.setTag(holder); 


    } 
    holder = (Holder) convertView.getTag(); 


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

     @Override 
     public void onClick(View v) { 

      if(holder.getShareButtons().getVisibility()==View.GONE){ 
       holder.getShareButtons().setVisibility(View.VISIBLE); 

      } 
      else{ 
       holder.getShareButtons().setVisibility(View.GONE); 

      } 


     } 
    }); 

    return convertView; 
} 

但是,所有我得到很奇怪的行爲。 onClickListener和setVisibilty方法被正確調用,但我的視圖有時可見,有時不可見,這取決於列表滾動位置。

我在做什麼錯了,我該如何解決這個問題?

回答

4

當列表視圖滾動時,子視圖將被重用並重新分配到新的位置。這是爲了提高效率,因爲創建新視圖非常昂貴。但是,它給程序員帶來了負擔 - 在每次調用getView時都必須完全重置視圖的每個值。因此,如果按下子按鈕中的某個按鈕來更改其某個成員的可見性,則需要記住每個數字位置的可見性,並且在getView中必須爲每個元素設置適當的可見性。

+0

謝謝我的問題現在解決了 – 2013-03-14 15:17:58

1

由於性能方面的原因,持有人意圖保持對內部視圖的引用。它與列表中顯示的數據無關 - 僅與列表中的「單元格」有關。你應該根據你的數據確定東西是否可見。

1

這裏是我的自定義適配器的片段,這將給你如何應對適配器本身內的項目點擊一個例子:

功能:每一行代表可以看到或沒看到一個對象。無論是否被看到,圖像都是不同的。點擊一個項目打開/關閉圖像。

public class Exampledapter extends ArrayAdapter<CustomObject> { 

    private Context mContext; 
    private int mLayoutResourceId; 
    private ArrayList<CustomObject> mData = null; 

    public ExampleAdapter(Context context, int layoutResourceId, ArrayList<CustomObject> data, DataSource datasource) { 
     super(context, layoutResourceId, data); 
     this.mLayoutResourceId = layoutResourceId; 
     this.mContext = context; 
     this.mData = data; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View lRow = convertView; 
     ViewHolder holder = null; 

     if (lRow == null) { 
      LayoutInflater lInflater = ((Activity) mContext).getLayoutInflater(); 
      lRow = lInflater.inflate(mLayoutResourceId, parent, false); 

      holder = new ViewHolder(); 
      holder.txtTitle = (TextView) lRow.findViewById(R.id.text_); 
      holder.imageSeen = (ImageView) lRow.findViewById(R.id.image_toggle); 

      lRow.setTag(holder); 
     } else { 
      holder = (ViewHolder) lRow.getTag(); 
     } 

     holder.imageSeen.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       onListItemClick(position); 
      } 
     }); 

     if (mData.get(position).getSeen() == 1) { 
      holder.imageSeen.setImageBitmap(mImageSeen); 
     } else { 
      holder.imageSeen.setImageBitmap(mImageUnseen); 
     } 

     holder.txtTitle.setText(mData.get(position).getTitle()); 
     return lRow; 
    } 

    protected void onListItemClick(int position) { 
     if (mData.get(position).isSeen()) {  
      mData.get(position).setSeen(0); 
     } else { 
      mData.get(position).setSeen(1); 
     } 
     notifyDataSetChanged(); 
    } 

    class ViewHolder { 
     TextView txtTitle; 
     ImageView imageSeen; 
    } 
} 
相關問題