2013-08-26 2 views
0

Я читал сообщения о пользовательских адаптерах и о том, как их индексировать, но, похоже, я не могу выполнить свою работу. Я перезаписываю getView, и мой XML содержит 1 TextView и 2 кнопки. Я сделал так, что обе кнопки были обнаружены onClickListener, но я не мог отличить, какой элемент ListView был тем, кто вызвал ClickEvent. Я пробовал использовать другой подход, но всегда получаю исключение NullPointerException в методе onClick.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

ответ

1

Попробуйте использовать getPositionForView(v) найти позицию, которая коррелирует с кнопкой, которая была нажата.

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; 
} 

Чтобы получить идентификатор кнопки, вам просто нужно:

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; 

} 
Смежные вопросы