Java 正在通过onClickListener调用ListView项onItemClick
在我的列表中,我有一些项目里面有一个按钮,当前每当我尝试单击按钮时,它也会触发单击。下面的代码在getView中Java 正在通过onClickListener调用ListView项onItemClick,java,android,Java,Android,在我的列表中,我有一些项目里面有一个按钮,当前每当我尝试单击按钮时,它也会触发单击。下面的代码在getView中 holder.btnAdd.setTag(tg); holder.btnAdd.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int id = v.getId();
holder.btnAdd.setTag(tg);
holder.btnAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int id = v.getId();
Toast.makeText(getParent().getActivity(), "clicked this button",Toast.LENGTH_LONG).show();
});
这是onItemClick,它位于适配器外部
HorizontalListView hlv = (HorizontalListView) view
.findViewById(R.id.gallery);
GalleryAdapter ga = new GalleryAdapter(offerItemDetailsFragment,
result);
ga.setListView(hlv);
hlv.setAdapter(ga);
hlv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
RelatedOffer relOffer = (RelatedOffer) parent.getAdapter().getItem(position);
...
}
});
horizontalistView hlv=(horizontalistView)视图
.findviewbyd(R.id.gallery);
GalleryAdapter ga=新GalleryAdapter,
结果);
ga.setListView(hlv);
hlv.setAdapter(ga);
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
RelatedOffer relOffer=(RelatedOffer)parent.getAdapter().getItem(位置);
...
}
});
如果您的列表中有按钮,请尝试检索按钮的id,并使用与按钮相关的单击侦听器,或者如果您有自定义适配器,请在自定义适配器中为按钮编写侦听器
请访问希望它能帮助您
假设你有你的持有人如下
static class UserHolder {
TextView textName;
TextView textAddress;
TextView textLocation;
Button btnEdit;
Button btnDelete;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
UserHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new UserHolder();
holder.textName = (TextView) row.findViewById(R.id.textView1);
holder.textAddress = (TextView) row.findViewById(R.id.textView2);
holder.textLocation = (TextView) row.findViewById(R.id.textView3);
holder.btnEdit = (Button) row.findViewById(R.id.button1);
holder.btnDelete = (Button) row.findViewById(R.id.button2);
row.setTag(holder);
} else {
holder = (UserHolder) row.getTag();
}
User user = data.get(position);
holder.textName.setText(user.getName());
holder.textAddress.setText(user.getAddress());
holder.textLocation.setText(user.getLocation());
holder.btnEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("Edit Button Clicked", "**********");
Toast.makeText(context, "Edit button Clicked",
Toast.LENGTH_LONG).show();
}
});
holder.btnDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("Delete Button Clicked", "**********");
Toast.makeText(context, "Delete button Clicked",
Toast.LENGTH_LONG).show();
}
});
return row;
}
关于这一点,请尝试按如下方式编写getView
static class UserHolder {
TextView textName;
TextView textAddress;
TextView textLocation;
Button btnEdit;
Button btnDelete;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
UserHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new UserHolder();
holder.textName = (TextView) row.findViewById(R.id.textView1);
holder.textAddress = (TextView) row.findViewById(R.id.textView2);
holder.textLocation = (TextView) row.findViewById(R.id.textView3);
holder.btnEdit = (Button) row.findViewById(R.id.button1);
holder.btnDelete = (Button) row.findViewById(R.id.button2);
row.setTag(holder);
} else {
holder = (UserHolder) row.getTag();
}
User user = data.get(position);
holder.textName.setText(user.getName());
holder.textAddress.setText(user.getAddress());
holder.textLocation.setText(user.getLocation());
holder.btnEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("Edit Button Clicked", "**********");
Toast.makeText(context, "Edit button Clicked",
Toast.LENGTH_LONG).show();
}
});
holder.btnDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("Delete Button Clicked", "**********");
Toast.makeText(context, "Delete button Clicked",
Toast.LENGTH_LONG).show();
}
});
return row;
}
因此您的自定义适配器可以看起来像
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class UserCustomAdapter extends ArrayAdapter<User> {
Context context;
int layoutResourceId;
ArrayList<User> data = new ArrayList<User>();
public UserCustomAdapter(Context context, int layoutResourceId,
ArrayList<User> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
UserHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new UserHolder();
holder.textName = (TextView) row.findViewById(R.id.textView1);
holder.textAddress = (TextView) row.findViewById(R.id.textView2);
holder.textLocation = (TextView) row.findViewById(R.id.textView3);
holder.btnEdit = (Button) row.findViewById(R.id.button1);
holder.btnDelete = (Button) row.findViewById(R.id.button2);
row.setTag(holder);
} else {
holder = (UserHolder) row.getTag();
}
User user = data.get(position);
holder.textName.setText(user.getName());
holder.textAddress.setText(user.getAddress());
holder.textLocation.setText(user.getLocation());
holder.btnEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("Edit Button Clicked", "**********");
Toast.makeText(context, "Edit button Clicked",
Toast.LENGTH_LONG).show();
}
});
holder.btnDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("Delete Button Clicked", "**********");
Toast.makeText(context, "Delete button Clicked",
Toast.LENGTH_LONG).show();
}
});
return row;
}
static class UserHolder {
TextView textName;
TextView textAddress;
TextView textLocation;
Button btnEdit;
Button btnDelete;
}
}
import java.util.ArrayList;
导入android.app.Activity;
导入android.content.Context;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
公共类UserCustomAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
ArrayList数据=新的ArrayList();
public UserCustomAdapter(上下文上下文,int-layoutResourceId,
ArrayList数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
UserHolder=null;
if(行==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新用户holder();
holder.textName=(TextView)row.findViewById(R.id.textView1);
holder.textAddress=(TextView)row.findViewById(R.id.textView2);
holder.textLocation=(TextView)row.findViewById(R.id.textView3);
holder.btnEdit=(按钮)行.findViewById(R.id.button1);
holder.btnDelete=(按钮)行.findViewById(R.id.button2);
row.setTag(支架);
}否则{
holder=(UserHolder)row.getTag();
}
User=data.get(位置);
holder.textName.setText(user.getName());
holder.textAddress.setText(user.getAddress());
holder.textLocation.setText(user.getLocation());
holder.btnEdit.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Log.i(“单击编辑按钮”,“*******”);
Toast.makeText(上下文,“单击编辑按钮”,
Toast.LENGTH_LONG).show();
}
});
holder.btnDelete.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Log.i(“单击删除按钮”,“*******”);
Toast.makeText(上下文,“单击删除按钮”,
Toast.LENGTH_LONG).show();
}
});
返回行;
}
静态类用户持有者{
文本视图文本名称;
文本视图文本地址;
文本视图文本位置;
按钮btnEdit;
按钮btnDelete;
}
}
阅读更多信息:如果列表中包含内部可单击元素,则不能使用
OnItemClickListener
。相反,尝试向行的根布局中添加一个OnClickListener
,并在那里执行您的项单击逻辑。我确实为OnClickListener编写了一个匿名内部类,但仍然更新了答案。请访问适配器的根布局?恐怕我以前做过,这就是为什么我把它移到了GetView中我不确定我是否理解你的意思。现在在getView中有两个单击事件。一个用于按钮,另一个用于附加到行布局根视图的行。我知道我没有将其放在那里,因为我正在测试所有的可能性,现在我在适配器中有一个onClick,同时检查要触发的id,该id不适用于匿名OnClickListeners
。你需要做两个独立的。事件只针对它所附加到的视图触发,因此检查id毫无意义。有趣的是,即使我删除了OnClickListener,并单击了它仍然调用onItemClick事件的按钮。