Android 通过单击同一行的另一个元素来更改ListView元素

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

我有一个ListView和一个带有两个元素的简单适配器类。我只想通过点击另一个元素来更改一个元素,但每当我向下或向上滚动时,更改就会消失。我研究过这两个环节

我知道listView有回收功能,这就是原因,但我想要一个不刷新整个列表的简单解决方案,当我在多行上更改时,它应该在调用getView后出现,我的意思是在上下滚动之后。 这是我的适配器类代码

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上简单插入一个标签。