Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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 更改自定义listview项_Android_Listview - Fatal编程技术网

Android 更改自定义listview项

Android 更改自定义listview项,android,listview,Android,Listview,事实上,我有一个列表视图,它有“两个图像+两个文本视图”作为一个项目 我真正想做的是,当用户单击图像时,我想更改textview的文本 公共类ListViewCustomAdapter扩展BaseAdapter实现OnClickListener{ `ViewHolder holder;` `ArrayList<Object> itemList;` `public Activity context;` `public LayoutInflater inflater;` `publi

事实上,我有一个列表视图,它有“两个图像+两个文本视图”作为一个项目

我真正想做的是,当用户单击图像时,我想更改textview的文本

公共类ListViewCustomAdapter扩展BaseAdapter实现OnClickListener{

`ViewHolder holder;`
`ArrayList<Object> itemList;`

`public Activity context;`
`public LayoutInflater inflater;`

`public ListViewCustomAdapter(Activity context,ArrayList<Object> itemList) {`
    `super();`

    `this.context = context;`
    `this.itemList = itemList;`

    `this.inflater =` `(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);`
`}`

`@Override`
`public int getCount() {`
    `// TODO Auto-generated method stub`
    `return itemList.size();`
`}`

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

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

`public static class ViewHolder`
`{`
    `ImageView plus;`
    `ImageView minus;`
    `TextView question;`
    `TextView score;`
`}`

`@Override`
`public View getView(int position, View convertView, ViewGroup parent) {`
    `// TODO Auto-generated method stub`


    `if(convertView==null)`
    `{`
        `holder = new ViewHolder();`
        `convertView = inflater.inflate(R.layout.listitem_row, null);`

        `holder.plus = (ImageView) convertView.findViewById(R.id.plus);`
        `holder.minus = (ImageView) convertView.findViewById(R.id.minus);`

        `holder.plus.setOnClickListener(this);`
        `holder.minus.setOnClickListener(this);`

        `holder.question = (TextView) convertView.findViewById(R.id.question);`
        `holder.score = (TextView) convertView.findViewById(R.id.score);`

                    `convertView.setTag(holder);`
    `}`
    `else`
        `holder=(ViewHolder)convertView.getTag();`

    `ItemBean bean = (ItemBean) itemList.get(position);`

    `holder.minus.setImageResource(bean.getminus());`
    `holder.plus.setImageResource(bean.getplus());`
    `holder.question.setText(bean.getquestion());`
    `holder.score.setText(bean.getscore());`

    `return convertView;`
`}`

`@Override`
`public void onClick(View v) {`
    `switch(v.getId()) {`
        `case R.id.minus:`
        `{`

            `int score = Integer.getInteger(holder.score.getText().toString());`
            `holder.score.setText(Integer.toString(score-1));`
            `break;`
        `}`
        `case R.id.plus:`
        `{`

            `int score = Integer.getInteger(holder.score.getText().toString());`
            `holder.score.setText(Integer.toString(score+1));`
            `break;`
        `}`
    `}}`
`ViewHolder`
`ArrayList项目列表`
`公共活动语境`
`公共场所;充气机`
`public ListViewCustomAdapter(活动上下文,ArrayList itemList){`
`超级()`
`this.context=上下文`
`this.itemList=itemList`
`this.inflater=``(LayoutInflater)context.getSystemService(context.LAYOUT\u inflater\u SERVICE)`
`}`
`@凌驾`
`public int getCount(){`
`//TODO自动生成的方法存根`
`返回itemList.size()`
`}`
`@凌驾`
`公共对象getItem(int位置){`
`//TODO自动生成的方法存根`
`返回itemList.get(位置)`
`}`
`@凌驾`
`公共长getItemId(int位置){`
`//TODO自动生成的方法存根`
`返回0`
`}`
`公共静态类视图持有者`
`{`
`ImageView plus`
`图像视图减号`
`文本视图问题`
`文本视图分数`
`}`
`@凌驾`
`公共视图getView(int位置、视图转换视图、视图组父视图){`
`//TODO自动生成的方法存根`
`if(convertView==null)`
`{`
`holder=新的ViewHolder()`
`convertView=充气机。充气(R.layout.listitem_行,空)`
`holder.plus=(ImageView)convertView.findViewById(R.id.plus)`
`holder.减号=(ImageView)convertView.findViewById(R.id.减号)`
`holder.plus.setOnClickListener(此)`
`holder.减号.setOnClickListener(此)`
`holder.question=(TextView)convertView.findViewById(R.id.question)`
`holder.score=(TextView)convertView.findViewById(R.id.score)`
`convertView.setTag(支架)`
`}`
`否则`
`holder=(ViewHolder)convertView.getTag()`
`ItemBean=(ItemBean)itemList.get(位置)`
`setImageResource(bean.getminus())`
`setImageResource(bean.getplus())`
`holder.question.setText(bean.getquestion())`
`holder.score.setText(bean.getscore())`
`返回视图`
`}`
`@凌驾`
`公共void onClick(视图v){`
`开关(v.getId()){`
`案例R.id.减:`
`{`
`int score=Integer.getInteger(holder.score.getText().toString())`
`holder.score.setText(Integer.toString(score-1))`
`中断`
`}`
`案例R.id.plus:`
`{`
`int score=Integer.getInteger(holder.score.getText().toString())`
`holder.score.setText(Integer.toString(score+1))`
`中断`
`}`
`}}`
}

我得到空指针异常。 我认为问题在于,程序无法理解它应该以哪个文本视图为目标,就像这个列表视图中有多个项目,每个项目都包含这个分数文本视图项目


请帮帮我

最好的做法是在创建ListItem时为其设置onClickListener。然后,您可以指定ListItem在单击时的作用,以便告诉它更改其TextView文本

下面是一个关于创建该设置的非常好的教程:

不要使用其他代码替换以下代码

`if(convertView==null)`
    `{`
        `holder = new ViewHolder();`
        `convertView = inflater.inflate(R.layout.listitem_row, null);`

        `holder.plus = (ImageView) convertView.findViewById(R.id.plus);`
        `holder.minus = (ImageView) convertView.findViewById(R.id.minus);`

        `holder.plus.setOnClickListener(this);`
        `holder.minus.setOnClickListener(this);`

        `holder.question = (TextView) convertView.findViewById(R.id.question);`
        `holder.score = (TextView) convertView.findViewById(R.id.score);`

                    `convertView.setTag(holder);`
    `}
        `holder=(ViewHolder)convertView.getTag();`

    `ItemBean bean = (ItemBean) itemList.get(position);`

    `holder.minus.setImageResource(bean.getminus());`
    `holder.plus.setImageResource(bean.getplus());`
    `holder.question.setText(bean.getquestion());`
    `holder.score.setText(bean.getscore());`

    `return convertView;`
`}`

首先,您没有将onClick侦听器分配给基本适配器中的任何视图

其次,我建议您在列表中使用onClick事件,而不是使用onClick事件。这是一个非常直接的方法,更好地用于行项目单击

例如:

private OnItemClickListener lstClick = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                 int position, long id) {

        //do whatever you want here
    }
};

而不是convertView.setTag(holder);holder=(ViewHolder)convertView.getTag()` 使用convertView.setId(holder);和holder=(ViewHolder)convertView.getId()

谢谢大家

但是我的问题的解决方法非常简单和聪明,我已经解决了

我使用holder.减号.setTag(holder)附加了holder;针对listview每行的每一项(button/imageview),然后在特定button/imageview的Onclick侦听器中使用holder=(ViewHolder)v.getTag();要为ListView的该项使用特定的持有者:),请玩得开心

@凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){

holder.plus.setTag(holder); holder.减.setTag(holder)


这没有任何区别使用普通的ViewHolder而不是静态ViewHolder。单击侦听器有问题吗?OnItemClickListener用于ListActivity,我正在处理Activity。仍然感谢!!OnItemClickListener用于ListView,ListActivity是ListView与Activity的派生形式。因此我的建议仍然有效。您可以将OnItemClickListener用于ListView。有关详细信息,请阅读“确定”。谢谢。我找到了另一个解决方案,我已经发布了。您在其中声明变量的“TYPE\u SEPARATOR”“TYPE\u ITEM”
listView.setOnItemClickListener(lstClick);
        int type = getItemViewType(position);

        System.out.println("getView " + position + " " + convertView + " type = " + type);
        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case TYPE_ITEM:
                    convertView = mInflater.inflate(R.layout.item, null);
                    holder.score = (TextView)convertView.findViewById(R.id.score);
                    holder.question = (TextView)convertView.findViewById(R.id.question);
                    holder.plus = (ImageView)convertView.findViewById(R.id.plus);


                    holder.minus = (ImageView)convertView.findViewById(R.id.minus);
                    holder.minus.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            holder = (ViewHolder)v.getTag();

                            String test =holder.score.getText().toString();

                    }
                        }
                    });


                    holder.plus.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {

                            holder = (ViewHolder)v.getTag();

                            String test =holder.score.getText().toString();

                                                    }
                    });


                    break;
                case TYPE_SEPARATOR:

                    convertView = mInflater.inflate(R.layout.heading, null);
                    holder.score = (TextView)convertView.findViewById(R.id.textSeparator);
                    holder.score.setText(mData.get(position));
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        switch (type) 
        {
            case TYPE_ITEM:

                String temp = mData.get(position);

                break;
            case TYPE_SEPARATOR:

                holder.score.setText(mData.get(position));

                break;
        }
        return convertView;
    }

}