2014-01-13 44 views
2

我有一個ListView與每行中的一些項目。其中一個項目是ImageView可點擊。我創建了一個單獨的Adapter類來創建ListView並用所有項目填充它。如何在ImageView中設置ListView中的OnClickListener?

在我的活動,我設置適配器,如下圖所示:

//myScenesArray is the array of items I want to fill in the Adapter 
ListView listView = (ListView) findViewById(R.id.sceneslistview); 
ListViewScenesAdapter customListAdapter = new ListViewScenesAdapter(this.getBaseContext(), R.layout.scenesrow, myScenesArray); 
listView.setAdapter(customListAdapter); 

我可以創建監聽到的每一行,如下:

listView.setOnItemClickListener(new OnItemClickListener() { 
public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
    //here I put what I want to do when Listener is activated 
}); 

但我怎麼能建立一個監聽器行內的物品?

我只訪問我行的項目適配器裏面......你看我的適配器的)下面的代碼,該方法getView(當我填寫的所有元素:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Log.i("ADAPTER DE CENAS","ENTROU NO getView()!!!"); 
LayoutInflater inflater = (LayoutInflater) 
    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View row = inflater.inflate(layoutResourceId, parent, false); 
    ImageView left = (ImageView)row.findViewById(R.id.left); 
    left.setImageBitmap((data.get(position)).getVisualImage()); 
    TextView middle = (TextView)row.findViewById(R.id.text); 
    middle.setText((data.get(position)).getVisualName()); 
    View right = row.findViewById(R.id.right); 
    right.setTag(position); 
    return row; 
} 

我可以訪問我的Activity中每行的元素?

我想在每行中設置一個Listener到視圖右側(R.id.right)。我感謝任何幫助。

更新

我已經有上下文作爲我的Adapter類的變量。我將張貼適配器類的開頭:

public class ListViewScenesAdapter extends ArrayAdapter<Scene> { 

Context context; 
int layoutResourceId; 
ArrayList<Scene> data = new ArrayList<Scene>(); 

public ListViewScenesAdapter(Context context, int layoutResourceId, ArrayList<Scene> data) { 
    super(context, layoutResourceId, data); 
    Log.i("ADAPTER DE CENAS","ENTROU NO CONSTRUTOR!!!"); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

適配器類具有上述的構造,已經提到的getView方法和變量:背景下,layoutResourceId和數據。

但是我不知道如何在Adapter類中做一個Listener。任何人都可以幫助我嗎?

+0

兩個ayorhan和四面楚歌的斯格回答正確,我認爲同樣的時間,只有在編輯不同。兩者都很好,但是當我訪問變量POSITION(知道我點擊的列表的當前位置)時,它顯示一個錯誤。我怎樣才能得到這個項目在偵聽器中的位置? –

+0

如果你們其中一個人都幫我發現,我會將其標記爲最終的正確答案。並感謝我的一切幫助! –

+0

@ayorhan看到這個 –

回答

2

將監聽到ImageView在適配器的getView方法。如果您需要訪問活動中的任何變量,則可以將它們作爲參數傳遞給適配器構造函數。

// This will set separate listeners to all of the right views. 
right.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Do whatever you want here, you can use the position variable to handle current view specifically 
      data.get(position); // this is the data you have in this listView item  
     } 
); 
+0

我可以在適配器內設置一個監聽器嗎? –

+0

我該怎麼做? –

+1

我更新了我的答案!當然你可以做。它確實將聽衆分配給所有項目,位置變量顯示當前項目。 – ayorhan

1

你應該可以在getView的權利。

如果您需要訪問上下文中的任何信息,只需在Adapter的構造函數中傳遞Context,然後從中獲取任何信息。

你可以不喜歡它:

right.setOnClickListener(new OnClickListener(){ 
    public void onClick(View view){ 
     Toast.makeText(context,"You clicked image " + position,Toast.LENGTH_LONG).show(); 
    } 
} 
+0

我已經擁有上下文作爲Adapter類的變量。但我不知道如何在適配器內部做一個Listener。它工作嗎?我以爲我只能在Activity或Fragment類中創建監聽器。 –

+1

@SarahSakamoto我在我的答案中舉了一個例子。它應該工作正常。 –

2

使用此在您的getView()

holder.imgIcon.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(getApplicationContext(),"ImageClick"+position, Toast.LENGTH_LONG).show(); 

     } 

}); 
相關問題