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