【问题标题】:ListView element change by clicking another element of same row通过单击同一行的另一个元素来更改 ListView 元素
【发布时间】:2015-11-22 16:26:44
【问题描述】:

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

Why do items disappear when I scroll the listView?

Clickable element in custom ListView row

我知道 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;
}

}

提前致谢。

【问题讨论】:

  • 您在hold.fCount.setText 中更改的值,同时更新您的arrayList posts 中的值。这样下次视图重新加载时,您将只获得更新的值。
  • 谢谢,您能解释一下我应该在哪里进行更改吗?我的意思是,如果我单击多行,那么每次我必须更改“帖子”上的值并调用构造函数来获取更改?
  • 您需要在pList 中设置此值,而不是在posts 中。您将在hold.fCount.setText 的下方onClickListener 中调用它

标签: android listview android-listview baseadapter getview


【解决方案1】:

当您增加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;
          }

}
};

【讨论】:

  • 当我放 fCount.setTag(position); 时无法解析方法 setTag(int);我应该把这个放在哪里?
  • viewHolder.fIcon.setTag(position);viewHolder.fCount.setText("" + pList.get(position).NumFrnd);之前添加这一行
  • 谢谢,我已经这样做了,但是在int position = (int)v.getTag(); 遇到异常实际上我通过删除 set 和 get tags 得到了解决方案,就像@Darpan 所说的那样,只是在 pList 上简单插入。
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多