1

Infact i have a listview and it has "two images + two Textviews" as an item.

What i exactly want to do is that i want to change the textview's text when user clicks the image.

public class ListViewCustomAdapter extends BaseAdapter implements 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;`
        `}`
    `}}`

}

I am getting null pointer exception. What i think the problem is, program is not able to understand that which textview it sould target, like there are multiple items in this listview, and each item contains this Score Textview item.

Plz help me out!!

4

5 回答 5

1

感谢大家。

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

我已经使用 holder.minus.setTag( holder ); 针对每行列表视图的每个项目(按钮/图像视图),然后在该特定按钮/图像视图的 Onclick 侦听器中,我正在使用 holder = (ViewHolder)v.getTag(); 为 ListView 的该项目使用特定的 Holder :) 玩得开心

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

        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);

持有人.plus.setTag(持有人); holder.minus.setTag(holder);

                    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;
    }

}
于 2012-05-08T04:16:23.267 回答
1

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

于 2012-04-20T11:52:40.430 回答
1

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

这是一个关于创建该设置的非常好的教程: http ://www.ezzylearning.com/tutorial.aspx?tid=1351248&q=handling-android-listview-onitemclick-event

于 2012-04-20T11:36:28.863 回答
0

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

其次,我建议您将OnItemClickListener用于您的 ListLiew ,而不是对行中的视图使用onClick事件。这非常简单,更适合用于行项目点击

例如:

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

        //do whatever you want here
    }
};

并将其设置为您的 ListView 为:

listView.setOnItemClickListener(lstClick);
于 2012-04-20T11:46:22.417 回答
0

不要使用 else 替换下面的代码

`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;`
`}`
于 2012-04-20T11:38:21.013 回答