Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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 从适配器中的onclick listener获取listiview对象_Android_Listview_Adapter - Fatal编程技术网

Android 从适配器中的onclick listener获取listiview对象

Android 从适配器中的onclick listener获取listiview对象,android,listview,adapter,Android,Listview,Adapter,您好,我有一个带有适配器和对象类的listview,每个listview位置都有一个按钮,适配器中有一个clicklistener,但是当我在listview中单击我的按钮时,它返回最后一个项目位置 这是我的适配器: public class comentario_adapter extends BaseAdapter { protected Activity activity; protected ArrayList<comentario_obj> items;

您好,我有一个带有适配器和对象类的
listview
,每个listview位置都有一个按钮,适配器中有一个clicklistener,但是当我在
listview
中单击我的
按钮时,它返回最后一个项目位置

这是我的适配器:

public class comentario_adapter extends BaseAdapter {
    protected Activity activity;
    protected ArrayList<comentario_obj> items;
    private Context mContext;
    comentario_obj prod;
    ImageButton correcta;
    boolean marcada = false;
    View vi;
    public comentario_adapter(Activity activity, ArrayList<comentario_obj> items, Context context) {
        this.activity = activity;
        this.items = items;
        this.mContext=context;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        if(convertView == null) {
            LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vi = inflater.inflate(R.layout.comentario_adapter, null);
        }

        prod = items.get(position);

        TextView title_coment = (TextView) vi.findViewById(R.id.title_coment);
        ImageButton voteup= (ImageButton) vi.findViewById(R.id.voteup);
        ImageButton votedown= (ImageButton) vi.findViewById(R.id.votedown);
        title_coment.setText(prod.getTitulo());

        ImageButton btn=(ImageButton)vi.findViewById(R.id.correcta);
        btn.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                if(mContext instanceof verPregunta_class){
                    ((verPregunta_class) mContext).MyMethod();
                        //NEED THE TITLE OF LISTVIEW POSITION CLICKED
                }
            }
        });

        return vi;
    }
    public interface IMethodCaller{
        void MyMethod();
    }
}
公共类comentario_适配器扩展BaseAdapter{
受保护的活动;
受保护的ArrayList项;
私有上下文;
comentario_obj产品;
图像按钮校正;
布尔值marcada=false;
视图六;
公共comentario_适配器(活动、ArrayList项、上下文){
这个。活动=活动;
这个项目=项目;
this.mContext=上下文;
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
公共对象getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
vi=转换视图;
if(convertView==null){
LayoutInflater充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u服务);
vi=充气机。充气(R.layout.comentario_适配器,空);
}
prod=items.get(位置);
TextView title\u coment=(TextView)vi.findViewById(R.id.title\u coment);
ImageButton voteup=(ImageButton)vi.findViewById(R.id.voteup);
ImageButton votedown=(ImageButton)vi.findViewById(R.id.votedown);
title_coment.setText(prod.getitulo());
ImageButton btn=(ImageButton)vi.findViewById(R.id.correcta);
btn.setOnClickListener(新建按钮.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(verPregunta_类的mContext实例){
((verPregunta_类)mContext.MyMethod();
//需要单击LISTVIEW位置的标题吗
}
}
});
返回vi;
}
公共接口IMethodCaller{
void MyMethod();
}
}

例如,您可以在OnCreate中为listview创建一个方法setOnItemClickListener,并在其内部询问项目在项目数组中的位置。比如说,

listview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
        int pos, long id) {  

        String titulo = array.get(pos).getTitulo();
}
listview.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
int pos,长id){
字符串titulo=array.get(pos.getitulo();
}
希望能有帮助

再见
});

好的,我已经用
setTag
找到了解决方案:

public class comentario_adapter extends BaseAdapter {
    protected Activity activity;
    protected ArrayList<comentario_obj> items;
    private Context mContext;
    comentario_obj prod;
    ImageButton correcta;
    boolean marcada = false;
    View vi;
    public comentario_adapter(Activity activity, ArrayList<comentario_obj> items, Context context) {
        this.activity = activity;
        this.items = items;
        this.mContext=context;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        if(convertView == null) {
            LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vi = inflater.inflate(R.layout.comentario_adapter, null);
        }

        prod = items.get(position);

        TextView title_coment = (TextView) vi.findViewById(R.id.title_coment);
        ImageButton voteup= (ImageButton) vi.findViewById(R.id.voteup);
        ImageButton votedown= (ImageButton) vi.findViewById(R.id.votedown);
        title_coment.setText(prod.getTitulo());

        final ImageButton btn=(ImageButton)vi.findViewById(R.id.correcta);
        **btn.setTag(prod.getId());**
        btn.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                if(mContext instanceof verPregunta_class){
                    ((verPregunta_class) mContext).MyMethod();
                        **String title = (String) v.getTag();**
                }
            }
        });

        return vi;
    }
    public interface IMethodCaller{
        void MyMethod();
    }
}
公共类comentario_适配器扩展BaseAdapter{
受保护的活动;
受保护的ArrayList项;
私有上下文;
comentario_obj产品;
图像按钮校正;
布尔值marcada=false;
视图六;
公共comentario_适配器(活动、ArrayList项、上下文){
这个。活动=活动;
这个项目=项目;
this.mContext=上下文;
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
公共对象getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
vi=转换视图;
if(convertView==null){
LayoutInflater充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u服务);
vi=充气机。充气(R.layout.comentario_适配器,空);
}
prod=items.get(位置);
TextView title\u coment=(TextView)vi.findViewById(R.id.title\u coment);
ImageButton voteup=(ImageButton)vi.findViewById(R.id.voteup);
ImageButton votedown=(ImageButton)vi.findViewById(R.id.votedown);
title_coment.setText(prod.getitulo());
最终图像按钮btn=(图像按钮)vi.findViewById(R.id.correcta);
**btn.setTag(prod.getId())**
btn.setOnClickListener(新建按钮.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(verPregunta_类的mContext实例){
((verPregunta_类)mContext.MyMethod();
**字符串标题=(字符串)v.getTag()**
}
}
});
返回vi;
}
公共接口IMethodCaller{
void MyMethod();
}
}

谢谢大家

简单的方法:制作
prod
localfinal或使用View.Tag。。。baziilion Times问道,也可以使用谷歌。是的,但是我和这个标签有什么关系?嗯,适配器内部也应该有同样的想法。你试过了吗?但是你有这个位置,所以理论上你可以做items.get(post).getitulo()不是吗?是的,但那会抛出'java.lang.IndexOutOfBoundsException:索引1无效,大小为0'。我想问题出在getView中。试着像这里这样做,然后重试items.get(post.getitulo()。祝你好运