【问题标题】:Set onClickListener into custom adapter将 onClickListener 设置为自定义适配器
【发布时间】:2014-03-23 13:53:30
【问题描述】:

大家好, 我有这个带有 2 个 button 和 2 个 textview 的适配器。

@Override
public View getView(int position, View view, ViewGroup parent) {
    if(view == null) {
        holder = new Holder();
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.my_adapter, null);
        holder.result = (TextView)view.findViewById(R.id.description);
        holder.value = (TextView)view.findViewById(R.id.value);
        holder.add = (Button)view.findViewById(R.id.add);
        holder.subtract = (Button)view.findViewById(R.id.subtract);         

        myObject = getItem(position);
        holder.result.setText(myObject.result);
        holder.value.setText(myObject.value);

        view.setTag(holder);
    } else {
        holder = (Holder)view.getTag();
    }

    holder.add.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            // TODO Auto-generated method stub  
        }           
    });

    return view;
}

现在我的问题是:如果我希望当用户按下添加按钮时将textview 的文本设置为(例如)5,我该怎么做?如果我放入onCLick 方法

holder.result.setText("My text") 设置最后一个文本视图的文本,而不是所选行项的对应文本视图(我禁用了对列表视图的点击):

@Override
public boolean isEnabled(int position) {
    return false;
}

我的问题有什么解决办法吗?

【问题讨论】:

    标签: java android listview adapter


    【解决方案1】:

    您应该将代码放在适配器内的getView 方法中,并记住使用对当前Button/TextVeiw 的引用,以便每个Button 对应于特定的TextView

    附:我在你的代码中发现了一些东西,看看这个:

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        if(view == null) {
            holder = new Holder();
            inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.my_adapter, null);
            holder.result = (TextView)view.findViewById(R.id.description);
            holder.value = (TextView)view.findViewById(R.id.value);
            holder.add = (Button)view.findViewById(R.id.add);
            holder.subtract = (Button)view.findViewById(R.id.subtract); 
    
            view.setTag(holder);
        } else {
            holder = (Holder)view.getTag();
        }       
    
        myObject = getItem(position);
        holder.result.setText(myObject.result);
        holder.value.setText(myObject.value);
        final TextView tv = holder.result;
    
        holder.add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                tv.setText("bla bla");          
                }           
        });
    
        return view;
    }
    

    【讨论】:

    • 方法getView已经在适配器中了!为方便起见,我只发布了 getView 方法。你说的是哪些参考文献?
    • onClick 方法已经进入 getView 方法。你的意思是?我不明白。请更好地解释一下。
    • 我的意思是发布你在OnClickListener 中的实际代码,但检查更新的答案,我猜你在OnClickListener 中使用了final holder.result.setText,而你应该使用@ 987654331@那里
    【解决方案2】:

    你搞混了,getItem 必须在视图创建的东西下面。首先创建视图,然后设置值。

    @Override
    public View getView(int position, View view, ViewGroup parent) {
    if(view == null) {
        holder = new Holder();
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.my_adapter, null);
        holder.result = (TextView)view.findViewById(R.id.description);
        holder.value = (TextView)view.findViewById(R.id.value);
        holder.add = (Button)view.findViewById(R.id.add);
        holder.subtract = (Button)view.findViewById(R.id.subtract);         
        view.setTag(holder);
    } else {
        holder = (Holder)view.getTag();
    }
    
    myObject = getItem(position);
    holder.result.setText(myObject.result);
    holder.value.setText(myObject.value);
    
    holder.add.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
    
         //What should happen here?
    
        }           
    });
    
    return view;
    

    }

    【讨论】:

    • 在 onClick 方法中,我应该为相应的 TextView 设置一个文本。我的代码和你的代码有什么区别?
    • listView 中的视图被回收,这就是为什么你使用持有者模式来快速访问视图。您的代码仅在您第一次创建视图时工作,第二次检索持有人时,但您没有设置新值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多