2013-08-26 164 views
0

我閱讀關於自定義適配器的帖子,以及如何爲它們編制索引,但似乎我無法讓我的工作。我覆蓋了getView,我的XML包含1個TextView和2個按鈕。我做了兩個按鈕被onClickListener檢測到,但我無法區分哪個ListView元素是觸發ClickEvent的元素。我試過我不同的方法,但我總是在onClick方法中得到一個NullPointerException。Android ListView onClickListener自定義適配器

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    ViewHolder holder;  
    if(convertView == null){ 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.listexample, null); 
     holder = new ViewHolder(); 
     holder.textView = (TextView) convertView.findViewById(R.id.commandLine_text); 
     holder.start = (Button) convertView.findViewById(R.id.test_start_button); 
     holder.stop = (Button) convertView.findViewById(R.id.test_stop_button); 
     convertView.setTag(holder); 
     convertView.findViewById(R.id.commandLine_text); 
     convertView.findViewById(R.id.test_start_button); 
     convertView.findViewById(R.id.test_stop_button); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.textView.setText(this.getItem(position)); 
    holder.start.setOnClickListener(this); 
    holder.stop.setOnClickListener(this); 
    return convertView; 

} 
@Override 
public void onClick(View v) { 
//Here i want to know which button of the two (start,stop) was clicked and what position 
    int position =(Integer)v.getTag(); 
    Log.d("OnClick","Position: "+position); 

} 
static class ViewHolder { 
    TextView textView; 
    Button start; 
    Button stop; 
} 
+0

您需要爲您的按鈕設置標籤'holder.start.setTag(1); holder.start.setTag(2)'然後在'onClick'中獲取標籤 – Raghunandan

回答

0

,我認爲你的錯誤是:

v.getTag() 

您正在試圖擺脫的按鈕來查看標籤,你應該從列表中的項目得到它。 假設你的按鈕直接放在列表項目視圖上,你應該得到按鈕的父視圖並從那裏獲取標籤。

View parentView = (View)v.getParent(); 
ViewHolder viewHolder = (ViewHolder)parentView.getTag(); 

如果你想在項目的位置,加INT位置到您的ViewHolder類,你會得到這樣的:

int position = viewHolder.Position; 

你ViewHolder類是這樣的:

static class ViewHolder 
{ 
    TextView textView; 
    Button start; 
    Button stop; 
    int Position; 
} 

要獲得按鈕ID,您只需執行以下操作:

v.getId() 
0

如果您在getView中使用匿名內部偵聽器,將會容易得多。從長遠來看,這會讓生活變得更容易。雖然它不能在非常繁重的列表項中花費一些時滯(不到一秒)。

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
ViewHolder holder;  
if(convertView == null){ 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.listexample, null); 
    holder = new ViewHolder(); 
    holder.textView = (TextView) convertView.findViewById(R.id.commandLine_text); 
    holder.start = (Button) convertView.findViewById(R.id.test_start_button); 
    holder.stop = (Button) convertView.findViewById(R.id.test_stop_button); 
    convertView.setTag(holder); 
    convertView.findViewById(R.id.commandLine_text); 
    convertView.findViewById(R.id.test_start_button); 
    convertView.findViewById(R.id.test_stop_button); 

} else { 
    holder = (ViewHolder) convertView.getTag(); 
} 
holder.textView.setText(this.getItem(position)); 
holder.start.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
    //Here i want to know which button of the two (start,stop) was clicked and what position 

    Log.d("OnClick start","Position: "+position); 

    } 
}); 

holder.stop.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v){ 
     Log.d("OnClick stop","Position: "+position); 
    } 

}); 
return convertView; 

} 
相關問題