Java 使用同一行上的按钮更改listview中的编号

Java 使用同一行上的按钮更改listview中的编号,java,android,xml,click,Java,Android,Xml,Click,我创建了一个自定义的ListActivity,它在技能和按钮旁边显示了一个列表以及一个数字。列表如下所示: 技能名称和点数(PTS)都是从数据库中提取的。我需要帮助弄清楚如何设置侧面的按钮,使其可点击,并增加或减少其相关点列数 我将尝试双倍奖励,并询问是否有人知道我如何检索所有这些值并更新从中提取它们的数据库,可能是在屏幕底部的“Finalize”按钮上。膨胀XML视图后,使用findViewById查找按钮,然后添加onClickListener() 注意:请记住缓存视图 希望这有助于一些假

我创建了一个自定义的ListActivity,它在技能和按钮旁边显示了一个列表以及一个数字。列表如下所示:

技能名称和点数(PTS)都是从数据库中提取的。我需要帮助弄清楚如何设置侧面的按钮,使其可点击,并增加或减少其相关点列数


我将尝试双倍奖励,并询问是否有人知道我如何检索所有这些值并更新从中提取它们的数据库,可能是在屏幕底部的“Finalize”按钮上。

膨胀XML视图后,使用findViewById查找按钮,然后添加onClickListener()

注意:请记住缓存视图

希望这有助于一些假设:

  • 您有一个名为skillLayout的视图布局
  • 在视图中有两个名为skillUp和skillDown的按钮
  • 技能等级如下

    private class Skill {
    
        private int skill = 0;
    
        public void skillUp() {
            skill++;
        }
    
        public void skillDown() {
            skill--;
        }
    }
    
在执行下面的c&p代码之前,必须创建一个ids.xml文件int res/values文件夹

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="skillId"/>
</resources>

然后将此代码用作您的技能适配器

class SkillAdapter extends ArrayAdapter<Skill> {

    public SkillAdapter(Context context, int textViewResourceId,
            List<Skill> skills) {
        super(context, textViewResourceId, skills);
    }

    private final View.OnClickListener skillUpListener = new View.OnClickListener() {
        public void onClick(View v) {
            // Note: a better approach may be call to a method 
            // into your application base class.
            Skill s = (Skill) v.getTag(R.id.skillId);
            s.skillUp();
        }
    };

    private final View.OnClickListener skillDownListener = new View.OnClickListener() {
        public void onClick(View v) {
            // Note: a better approach may be call to a method 
            // into your application base class.
            Skill s = (Skill) v.getTag(R.id.skillId);
            s.skillDown();
        }
    };

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

        final Skill s = getItem(position);

        RecycledView recycled = null;

        if (convertView == null) {

            LayoutInflater li = (LayoutInflater) this.getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = li.inflate(R.layout.skillLayout, null);

            recycled.buttonUp = (Button) convertView
                    .findViewById(R.id.skillUp);
            recycled.buttonDown = (Button) convertView
                    .findViewById(R.id.skillDown);

            recycled.buttonUp.setOnClickListener(skillUpListener);
            recycled.buttonDown.setOnClickListener(skillDownListener);

        } else {
            recycled = (RecycledView) convertView.getTag();
        }

        recycled.buttonUp.setTag(R.id.skillId, s);
        recycled.buttonDown.setTag(R.id.skillId, s);

                    // Fill the row list with your data

        return convertView;
    }
}

    // For recycling stuff
static class RecycledView {
    Button buttonUp;
    Button buttonDown;
}
class SkillAdapter扩展了ArrayAdapter{
公共SkillAdapter(上下文,int textViewResourceId,
列出技能){
超级(上下文、textViewResourceId、技能);
}
private final View.OnClickListener skillUpListener=new View.OnClickListener(){
公共void onClick(视图v){
//注意:更好的方法可能是调用方法
//进入应用程序基类。
技能s=(技能)v.getTag(R.id.skillId);
s、 skillUp();
}
};
private final View.OnClickListener skillDownListener=新视图。OnClickListener(){
公共void onClick(视图v){
//注意:更好的方法可能是调用方法
//进入应用程序基类。
技能s=(技能)v.getTag(R.id.skillId);
s、 skillDown();
}
};
公共视图getView(int位置、视图转换视图、视图组父视图){
最终技能s=getItem(位置);
RecycledView recycled=null;
if(convertView==null){
LayoutInflater li=(LayoutInflater)this.getContext()
.getSystemService(上下文布局\充气机\服务);
convertView=li.充气(R.layout.skillLayout,null);
recycled.buttonUp=(按钮)convertView
.findviewbyd(R.id.skillUp);
recycled.buttonDown=(按钮)convertView
.findviewbyd(R.id.skillDown);
回收.buttonUp.setOnClickListener(skillUpListener);
回收.buttonDown.setOnClickListener(skillDownListener);
}否则{
recycled=(RecycledView)convertView.getTag();
}
回收.按钮.设置标签(R.id.skillId,s);
回收的.buttonDown.setTag(R.id.skillId,s);
//用您的数据填充行列表
返回视图;
}
}
//用于回收材料
静态类RecycledView{
纽扣;
按钮向下;
}
我希望这能澄清问题


问候

在选择按钮之前,我一直支持您。如果我通过条目列表添加了它们,即它们是通过编程方式添加的,它如何找到正确的按钮?它们确实有一个id(或者可以),但它们都是相同的id,因为它是反复使用的同一个对象您可以使用convertView.findViewById将您的按钮搜索到convertView对象中,如果convertView为空,则该对象可以是新对象;如果convertView为非空,则该对象可以是循环对象。这不是很有效率,但它的工作。我会给你写一个更好的例子。
class SkillAdapter extends ArrayAdapter<Skill> {

    public SkillAdapter(Context context, int textViewResourceId,
            List<Skill> skills) {
        super(context, textViewResourceId, skills);
    }

    private final View.OnClickListener skillUpListener = new View.OnClickListener() {
        public void onClick(View v) {
            // Note: a better approach may be call to a method 
            // into your application base class.
            Skill s = (Skill) v.getTag(R.id.skillId);
            s.skillUp();
        }
    };

    private final View.OnClickListener skillDownListener = new View.OnClickListener() {
        public void onClick(View v) {
            // Note: a better approach may be call to a method 
            // into your application base class.
            Skill s = (Skill) v.getTag(R.id.skillId);
            s.skillDown();
        }
    };

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

        final Skill s = getItem(position);

        RecycledView recycled = null;

        if (convertView == null) {

            LayoutInflater li = (LayoutInflater) this.getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = li.inflate(R.layout.skillLayout, null);

            recycled.buttonUp = (Button) convertView
                    .findViewById(R.id.skillUp);
            recycled.buttonDown = (Button) convertView
                    .findViewById(R.id.skillDown);

            recycled.buttonUp.setOnClickListener(skillUpListener);
            recycled.buttonDown.setOnClickListener(skillDownListener);

        } else {
            recycled = (RecycledView) convertView.getTag();
        }

        recycled.buttonUp.setTag(R.id.skillId, s);
        recycled.buttonDown.setTag(R.id.skillId, s);

                    // Fill the row list with your data

        return convertView;
    }
}

    // For recycling stuff
static class RecycledView {
    Button buttonUp;
    Button buttonDown;
}