2014-04-01 27 views
0

我需要重新加載適配器,當buton被點擊。但我怎麼能執行它?我的代碼如下。如何從getView方法重新加載基本適配器

public class CustomGridAdapter extends BaseAdapter { 

private Context context; 
//private final String[] gridValues; 
ArrayList<Bitmap> arrayList; 
ImageButton i1; 

//Constructor to initialize values 
public CustomGridAdapter(Context context, ArrayList<Bitmap> ob) { 
    arrayList = ob; 
    this.context = context; 
    // this.gridValues  = gridValues; 
} 

@Override 
public int getCount() { 
    return arrayList.size(); 
} 

@Override 
public Object getItem(int position) { 

    return null; 
} 

@Override 
public long getItemId(int position) { 

    return 0; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    final int pos = position; 
    // LayoutInflator to call external grid_item.xml file 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View gridView; 

    if (convertView == null) { 

     gridView = new View(context); 

     // get layout from grid_item.xml (Defined Below) 

     gridView = inflater.inflate(R.layout.grid_item, null); 
     ImageView imageView = (ImageView) gridView 
       .findViewById(R.id.grid_item_image); 

     imageView.setImageBitmap(arrayList.get(position)); 
     ImageButton imageButton = (ImageButton) gridView 
       .findViewById(R.id.imageButton); 
     imageButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Log.d("myLogs", "Yes, onclick "+pos); 
       arrayList.remove(pos); 
       !!!THERE I NEED TO RELOAD IT 
      } 
     }); 
    } else { 

     gridView = (View) convertView; 
    } 

    return gridView; 
} 

}

回答

2

首先,你必須設置的事件,並在活動中使用它......你將不得不修改您的適配器,並添加到它的OnClickListener ATTR:

private Context context; 
private OnClickListener listener; 
ArrayList<Bitmap> arrayList; 
ImageButton i1; 

//Constructor to initialize values 
public CustomGridAdapter(Context context, ArrayList<Bitmap> ob, OnClickListener listener) { 
    arrayList = ob; 
    this.context = context; 
    this.listener = listener; 
} 

然後設置你的setOnClickListener,你必須做到以下幾點:

imageView.setImageBitmap(arrayList.get(position)); 
ImageButton imageButton = (ImageButton) gridView 
      .findViewById(R.id.imageButton); 
imageButton.setOnClickListener(listener); 

然後,在你的java,你需要讓你的活動實現onClickListener,然後重寫onClickListener方法,在這裏你可以用下面的方法來重新加載列表:

@Override 
public void onClick(View v) { 
     adapter = new CustomGridAdapter(MyActivity.this, myArrayListWithMyData, MyActivity.this); 

     listView.setAdapter(adapter); 

     listView.invalidate(); 
} 

要將適配器設置,你可以通過你的上下文(this,例如)作爲參數的OnClickListener

adapter = new CustomGridAdapter(this, myArrayListWithMyData, this); 

希望它能幫助!

+0

imageButton.setOnClickListener(context);這行不好 –

+0

你是什麼意思?它不工作? – Giacomoni

+0

是的,我不能處理按鈕onClick在另一個類 –

1

我相信你可以使用NotifyDataSetChanged();並且應該重新加載數據。

+0

http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged() – SimonSays

+0

這很好,但我想重新加載所有數據。我想刪除列表的midle的元素,但它每次都刪除最後一個元素 –

1

您的代碼的問題在於您的列表重用舊視圖,並且當視圖被重用時,監聽器不會重新註冊爲當前視圖,因爲您僅在創建新視圖時才註冊監聽器(不重用) 。使用下面的代碼:

...  
if (convertView == null) { 
       gridView = new View(context); 
       // get layout from grid_item.xml (Defined Below) 
       gridView = inflater.inflate(R.layout.grid_item, null); 
      } else { 
       gridView = (View) convertView; 
      } 
      ImageView imageView = (ImageView) gridView.findViewById(R.id.grid_item_image); 
      imageView.setImageBitmap(arrayList.get(position)); 
      ImageButton imageButton = (ImageButton) gridView.findViewById(R.id.imageButton); 
      imageButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d("myLogs", "Yes, onclick " + pos); 
        arrayList.remove(pos); 
        notifyDataSetChanged(); 
       } 
      }); 
    ... 

有關詳細信息使用和優化ListView,請參閱this Blog

相關問題