Android ListView onClickListener自定义适配器
我读了一些关于自定义适配器以及如何为它们编制索引的帖子,但似乎我无法使我的工作正常。我覆盖了getView,我的XML包含1个TextView和2个按钮。我让onClickListener检测到这两个按钮,但是我无法区分哪个ListView元素触发了ClickEvent。我尝试了不同的方法,但我总是在onClick方法中得到一个NullPointerExceptionAndroid ListView onClickListener自定义适配器,android,listview,adapter,onclicklistener,Android,Listview,Adapter,Onclicklistener,我读了一些关于自定义适配器以及如何为它们编制索引的帖子,但似乎我无法使我的工作正常。我覆盖了getView,我的XML包含1个TextView和2个按钮。我让onClickListener检测到这两个按钮,但是我无法区分哪个ListView元素触发了ClickEvent。我尝试了不同的方法,但我总是在onClick方法中得到一个NullPointerException @Override public View getView(int position, View convertView
@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;
}
尝试使用查找与按下的按钮相关的位置。我认为您的错误在于:
v.getTag()
您正试图从按钮视图中获取标记,应该从列表项中获取。
假设您的按钮直接位于列表项视图上,您应该获得按钮的父视图并从那里获得标记
View parentView = (View)v.getParent();
ViewHolder viewHolder = (ViewHolder)parentView.getTag();
如果需要项目的位置,请将int position添加到ViewHolder类中,您将得到如下结果:
int position = viewHolder.Position;
static class ViewHolder
{
TextView textView;
Button start;
Button stop;
int Position;
}
您的ViewHolder类如下所示:
int position = viewHolder.Position;
static class ViewHolder
{
TextView textView;
Button start;
Button stop;
int Position;
}
要获取按钮id,您只需执行以下操作:
v.getId()
如果在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;
}
您需要为按钮设置标签
holder.start.setTag(1);holder.start.setTag(2)
然后点击onClick获得标签