2015-04-23 86 views
0

到目前为止,我有一个使用自定义适配器的列表视图,列表中的每个项目都有一个按钮。 我真的很困惑;我试图做到以下几点:如何知道点击了哪个按钮

当用户点击按钮(删除按钮)列表中的项目,我想知道在哪个项目按钮被点击,所以我可以知道要删除的项目 - 我该如何执行这个?我见过有关设置标签的东西,但我仍然很迷茫。

我也尝试从主要活动的列表布局到达按钮,并且无法引用它。

请你能给我一个关于如何做我想做的感谢的详细描述。

添加的适配器代码:

public class LocationAdapter extends BaseAdapter{ 
String [] n; 
Context context; 
String[] a; 

private static LayoutInflater inflater=null; 
public LocationAdapter(MainActivity mainActivity, String[] names, String[] addresses) { 
    // TODO Auto-generated constructor stub 
    n=names; 
    context=mainActivity; 
    a=addresses; 
    inflater = (LayoutInflater)context. 
      getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return n.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public class Holder 
{ 
    TextView name; 
    TextView address; 
    ImageButton ib; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    Holder holder=new Holder(); 
    View rowView; 
    rowView = inflater.inflate(R.layout.rowlayout2, null); 
    holder.name =(TextView) rowView.findViewById(R.id.EditTextName); 
    holder.address =(TextView) rowView.findViewById(R.id.EditTextAddress); 
    holder.ib = (ImageButton) rowView.findViewById(R.id.Delete); 
    holder.name.setText(n[position]); 
    holder.address.setText(a[position]); 
    holder.ib.setTag(convertView); 
    rowView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "You Clicked "+n[position], Toast.LENGTH_LONG).show(); 
     } 

    }); 
    return rowView; 
} 

}

+0

基本上,onClickListener应该在Adapter的getView中实现,该getView具有position参数。你能发布你的适配器代码吗? – inmyth

回答

2

为您的delete按钮实施OnClickListener

当点击delete按钮,在position删除数据源中的行,然后调用notifyDataSetChanged()

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    Holder holder=new Holder(); 
    View rowView; 
    rowView = inflater.inflate(R.layout.rowlayout2, null); 
    holder.name =(TextView) rowView.findViewById(R.id.EditTextName); 
    holder.address =(TextView) rowView.findViewById(R.id.EditTextAddress); 
    holder.ib = (ImageButton) rowView.findViewById(R.id.Delete); 
    holder.name.setText(n[position]); 
    holder.address.setText(a[position]); 
    holder.ib.setTag(convertView); 

    //Add this for on-click of delete button 
    holder.ib.setOnClickListener(new OnClickListener(){ 
     //Delete the row in your data source specified at position 

    }); 

    rowView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "You Clicked "+n[position], Toast.LENGTH_LONG).show(); 
     } 

    }); 
    return rowView; 
} 
+0

感谢细节,现在快速的问题,我定义了一个名为位置在我的主要活动,从这个适配器获取数据,所以如何调用locations.remove()如果位置不知道从适配器类? – Isaac

+0

@Isaac如果适配器是活动的内部类,则可以在活动中有一个函数来删除该行,并从删除按钮OnClickListener中调用该函数。您可能希望将数据源更改为ArrayList而不是数组,因为您可以轻松地从ArrayList中添加和删除数据源。 –

+0

噢,也许我整个过程都做错了,因为我创建了一个独立的类..... – Isaac

1

使用此您getView()内的适配器的方法。

yourButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
       System.out.println("button : "+position+ " clicked"); 
       // Do you code here. 
     } 
    }); 
0
public class SeekBarAdapter {private SeekBarListener mListener; 
private ClickListener mListenerClick; 
public interface SeekBarListener { 

    public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser, int positionInList); 

    public void onStartTrackingTouch(SeekBar seekBar, int positionInList); 

    public void onStopTrackingTouch(SeekBar seekBar, int positionInList); 
} 

public interface ClickListener { 
    public void onClick(View v, int positionInList); 

} 

public listAdapter getAdapter(Context context, ItemPhotoEffect itemPhotoEff) { 
    return new listAdapter(context, itemPhotoEff); 
} 

public void setSeekBarListener(SeekBarListener listener) { 
    mListener = listener; 
} 

public void setClickListener(ClickListener listener) { 
    mListenerClick = listener; 
} 

public class listAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 
    private onSeekbarChange mSeekListener; 
    private onClickChange mImgClickListener; 
    private ArrayList<Bitmap> itemsList; 
    private Bitmap imgIcon; 
    private ArrayList<Integer> positionProgress; 
    private ArrayList<ColorEffectItem> colorItem; 

    public listAdapter(Context context, ItemPhotoEffect itemPhotoEff) { 
     mInflater = LayoutInflater.from(context); 
     if (mSeekListener == null) { 
      mSeekListener = new onSeekbarChange(); 
     } 
     if (mImgClickListener == null) { 
      mImgClickListener = new onClickChange(); 
     } 
     this.itemsList = itemPhotoEff.getSeekBarItem().getIconSeekBar(); 
     this.positionProgress = itemPhotoEff.getSeekBarItem() 
       .getPositionProgress(); 

     // if (itemPhotoEff.getSeekBarItem().getColorItem() != null) { 
     this.colorItem = itemPhotoEff.getSeekBarItem().getColorItem(); 
     // } 
    } 

    @Override 
    public int getCount() { 
     if (itemsList != null) { 
      return itemsList.size(); 

     } else { 
      return 0; 
     } 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     // if (convertView == null) { 
     holder = new ViewHolder(); 
     convertView = mInflater.inflate(R.layout.seekbar_adapter_layout, 
       null); 
     holder.img = (ImageView) convertView.findViewById(R.id.imageView1); 
     holder.seekbar = (SeekBar) convertView.findViewById(R.id.seekBar1); 
     holder.colorbutton = (ImageView) convertView 
       .findViewById(R.id.colorImage); 
     holder.ln_img = (LinearLayout) convertView 
       .findViewById(R.id.ln_colorimg); 
     convertView.setTag(holder); 
     // } else { 
     // holder = (ViewHolder) convertView.getTag(); 
     // } 
     holder.img.setImageBitmap(itemsList.get(position)); 

     if (positionProgress.get(position) != null) { 
      holder.seekbar.setVisibility(View.VISIBLE); 
      holder.ln_img.setVisibility(View.GONE); 
      holder.seekbar.setProgress(positionProgress.get(position)); 
     } else { 
      holder.ln_img.setVisibility(View.VISIBLE); 
      holder.seekbar.setVisibility(View.GONE); 
      holder.colorbutton.setBackgroundColor(Color.rgb(this.colorItem 
        .get(position).getRcolor(), this.colorItem 
        .get(position).getGcolor(), this.colorItem 
        .get(position).getBcolor())); 
     } 
     holder.seekbar.setOnSeekBarChangeListener(mSeekListener); 
     holder.ln_img.setOnClickListener(mImgClickListener); 
     holder.seekbar.setTag(position); 
     holder.ln_img.setTag(position); 
     return convertView; 

    } 
} 

static class ViewHolder { 
    ImageView img; 
    SeekBar seekbar; 
    ImageView colorbutton; 
    LinearLayout ln_img; 
}// This is class you need to know which button has been click 
public class onClickChange implements OnClickListener { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     int position = (Integer) v.getTag(); 
     if (mListenerClick != null) { 
      mListenerClick.onClick(v, position); 
     } 
    } 

} 

public class onSeekbarChange implements OnSeekBarChangeListener { 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser) { 
     int position = (Integer) seekBar.getTag(); 

     if (mListener != null) { 
      mListener.onProgressChanged(seekBar, progress, fromUser, 
        position); 
     } 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     int position = (Integer) seekBar.getTag(); 
     if (mListener != null) { 
      mListener.onStartTrackingTouch(seekBar, position); 
     } 
    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     int position = (Integer) seekBar.getTag(); 
     if (mListener != null) { 
      mListener.onStopTrackingTouch(seekBar, position); 
     } 
    } 
}} 

您可以使用mycode。在您的适配器中实现接口OnclickListener。 然后在活动中执行:
+ PositionInList如果行中有1个按钮,则使用该位置。

adapter.setClickListener(new ClickListener() { 
     @Override 
     public void onClick(View v, int positionInList) { 
      // TODO Auto-generated method stub 
      Log.i("", "Click on position in list" + positionInList); 
     } 
    }); 
0

你不应该使用数组。数组具有固定长度,因此您无法完全删除其元素。 你需要的地方阵列来使用ArrayList和正确实施ViewHolder模式:

ArrayList<Item> items = new ArrayList<>(); 
//merge both the content of a and n into one object "Item" 
//and use ArrayList 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

     Holder holder; 
     if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.rowlayout2, parent, false); 
     holder = new Holder(convertView); 
     convertView.setTag(holder); 
     } else { 
     holder = (Holder) convertView.getTag(); 
     } 

     holder.name.setText(getItem(position).name); 
     ... 
     holder.root.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      items.remove(position); 
      notifyDataSetChanged(); 
     } 
     }); 
    return convertView; 
} 

如果你想设置点击整行上,那么你需要把根元素ViewHolder内。

class Holder{ 
    TextView name, address, ...; 
    LinearLayout root; // or any Layout which is the root container of your row 
} 
相关问题