Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView onClickListener自定义适配器_Android_Listview_Adapter_Onclicklistener - Fatal编程技术网

Android ListView onClickListener自定义适配器

Android 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

我读了一些关于自定义适配器以及如何为它们编制索引的帖子,但似乎我无法使我的工作正常。我覆盖了getView,我的XML包含1个TextView和2个按钮。我让onClickListener检测到这两个按钮,但是我无法区分哪个ListView元素触发了ClickEvent。我尝试了不同的方法,但我总是在onClick方法中得到一个NullPointerException

    @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获得标签