Android 通过单击同一行的另一个元素来更改ListView元素
我有一个ListView和一个带有两个元素的简单适配器类。我只想通过点击另一个元素来更改一个元素,但每当我向下或向上滚动时,更改就会消失。我研究过这两个环节 我知道listView有回收功能,这就是原因,但我想要一个不刷新整个列表的简单解决方案,当我在多行上更改时,它应该在调用getView后出现,我的意思是在上下滚动之后。 这是我的适配器类代码Android 通过单击同一行的另一个元素来更改ListView元素,android,listview,android-listview,baseadapter,getview,Android,Listview,Android Listview,Baseadapter,Getview,我有一个ListView和一个带有两个元素的简单适配器类。我只想通过点击另一个元素来更改一个元素,但每当我向下或向上滚动时,更改就会消失。我研究过这两个环节 我知道listView有回收功能,这就是原因,但我想要一个不刷新整个列表的简单解决方案,当我在多行上更改时,它应该在调用getView后出现,我的意思是在上下滚动之后。 这是我的适配器类代码 public class Pha extends BaseAdapter { private List<PhaMessages> p
public class Pha extends BaseAdapter {
private List<PhaMessages> pList = new ArrayList<PhaMessages>();
private Activity context;
ViewHolder viewHolder = null;
int fCounted = 0;
public Pha(Activity cont, ArrayList<PhaMessages> posts){
this.context = cont;
this.pList = posts;
Log.d("pha","called constructor..");
}
static class ViewHolder {
protected TextView fCount;
protected ImageView fIcon;
}
@Override
public int getCount() {
return pList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
convertView = inflator.inflate(R.layout.pha_list_row, null);
viewHolder = new ViewHolder();
viewHolder.fIcon = (ImageView)convertView.findViewById(R.id.f_counter_img);
viewHolder.fCount = (TextView)convertView.findViewById(R.id.f_plus);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final ViewHolder hold = viewHolder;
viewHolder.fCount.setText("" + pList.get(position).NumFrnd);
viewHolder.fIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!t){
fCounted++;
hold.fCount.setText(""+fCounted);
// by doing this at list I can see an immediate change that the number is changing
//
//but is i do viewHolder.fCount.setText(""+fCounted); I see another row changing
}else {
Toast.makeText(context,"You have already clcik this.",Toast.LENGTH_SHORT).show();
}
}
});
return convertView;
}
}
公共类Pha扩展BaseAdapter{
private List pList=new ArrayList();
私人活动语境;
ViewHolder ViewHolder=null;
int fCounted=0;
公共Pha(活动控制、ArrayList职位){
this.context=cont;
this.pList=posts;
Log.d(“pha”,“被称为构造函数”);
}
静态类视窗夹{
受保护的文本视图fCount;
受保护的图像视图fIcon;
}
@凌驾
public int getCount(){
返回pList.size();
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutInflater充气器=上下文。getLayoutInflater();
convertView=充气机充气(R.layout.pha\u列表行,空);
viewHolder=新的viewHolder();
viewHolder.fIcon=(ImageView)convertView.findViewById(R.id.f_counter_img);
viewHolder.fCount=(TextView)convertView.findViewById(R.id.f_plus);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
最终视窗持有人持有=视窗持有人;
viewHolder.fCount.setText(“+pList.get(position.NumFrnd”);
viewHolder.fIcon.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(!t){
fCounted++;
hold.fCount.setText(“+fCounted”);
//通过在列表中这样做,我可以看到一个即时的变化,即数字正在变化
//
//但我做的是viewHolder.fCount.setText(“+fCounted”);我看到另一行正在更改
}否则{
Toast.makeText(上下文,“您已经完成了此操作。”,Toast.LENGTH_SHORT.show();
}
}
});
返回视图;
}
}
提前谢谢 当您增加
fCounted
值时,也会增加集合中的值,即pList
在getview
方法中,将位置作为标记放入fCount
组件中
viewHolder.fIcon.setTag(position); // this is to get exact position for which we will change/increment value
现在在fIcon的OnClickListener方法中
viewHolder.fIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!t){
fCounted++;
hold.fCount.setText(""+fCounted);
int position = (int)v.getTag();
int oldValue = pList.get(position).NumFrnd;
pList.get(position).NumFrnd = ++oldValue;
}
}
};
在hold.fCount.setText中更改的值,也在arrayList
posts
中更新该值。所以下次视图将重新加载时,您将只获得更新的值。谢谢,您能解释一下我应该在哪里进行更改吗?我的意思是,如果我单击多行,那么每次我都必须更改“posts”上的值,并调用构造函数来获得更改?您需要在pList
中设置此值,而不是在posts
中。当我放置fCount.setTag(位置)时,您将在onClickListener
中的hold.fCount.setText
正下方调用此函数;我应该把它放在哪里?viewHolder.fIcon.setTag(位置)代码>在viewHolder.fCount.setText(“+pList.get(position.NumFrnd)”之前添加此行代码>谢谢,我已经这样做了,但是在int position=(int)v.getTag()处出现异常代码>实际上,我通过删除set和get标记得到了解决方案,就像@Darpan所说的那样,只需在pList上简单插入一个标签。