【问题标题】:customlistadapter TextView values get change when scrolled down and set to its initial valuecustomlistadapter TextView 值在向下滚动并设置为其初始值时发生变化
【发布时间】:2016-03-23 10:12:27
【问题描述】:

在 CustomListAdapter 中,我有一个增量按钮和一个 textview 来显示其值,当我单击增量按钮时,我会增加值,然后将其存储到 sqlite db,然后我获取该值,然后将其设置为相应的 textview。

但是当我向下滚动时,它的值会变为初始值,即“0”
我之前提到过一个类似的问题,他们建议使用我也使用过但没有帮助我的viewholder。 我会很感激任何指导我如何做到这一点的人。 这是 CustomListAdapter 代码:

public class CustomListAdapter2 extends BaseAdapter {
  private SQLiteHandler db;
//    HashMap<Integer,Integer> quantity = new HashMap<Integer,Integer>();
private Activity activity;
private LayoutInflater inflater;
private List<com.example.malli.myapplication.model.Movie> movieItems;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
private EventBus bus = EventBus.getDefault();

public CustomListAdapter2(Activity activity, List<Movie> movieItems) {
    this.activity = activity;
    this.movieItems = movieItems;
    Log.d("size",String.valueOf(movieItems.size()));

    db = new SQLiteHandler(activity.getApplicationContext());
}


@Override
public int getCount() {
    return movieItems.size();
}

@Override
public Object getItem(int location) {
    return movieItems.get(location);
}

@Override
public long getItemId(int position) {
    return position;
}

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


   {
     ViewHolderItem viewHolder = null;
    if (inflater == null) {
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row2, null);


            if (imageLoader == null)
                imageLoader = AppController.getInstance().getImageLoader();

            viewHolder = new ViewHolderItem();
            viewHolder.thumbNail = (NetworkImageView) convertView
                    .findViewById(R.id.thumbnail);
          viewHolder.title=(TextView)convertView.findViewById(R.id.title);          
          viewHolder.rating=(TextView)convertView.findViewById(R.id.rating);
          viewHolder.genre=(TextView) convertView.findViewById(R.id.genre);
      viewHolder.addbutton=(Button)convertView.findViewById(R.id.addbutton);
        viewHolder.qty = (TextView) convertView.findViewById(R.id.qty);
        convertView.setTag(viewHolder);
        }else
        {
            viewHolder = (ViewHolderItem) convertView.getTag();

        }
            final Integer uniqueKey = Integer.valueOf(position);
            final Movie m = movieItems.get(position);

            // store the holder with the view.
            //    convertView.setTag(viewHolder);
            for(int j =0;j<20;j++){

                 String val1=db.getUser(j);

              if(val1 != null) {
                   viewHolder.qty.setText(db.getUser(j));
              }
               else{
                    viewHolder.qty.setText("0");
                   }
            }

    final ViewHolderItem finalViewHolder = viewHolder;

    viewHolder.addbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String val = finalViewHolder.qty.getText().toString();
            if(val == null)
            val= String.valueOf(1);
            else {
                val = String.valueOf(Integer.valueOf(val) + 1);
            Log.d("val",String.valueOf(val));
            } 
            db.add(m.getTitle(), String.valueOf(val),    
    String.valueOf(m.getRating1(),String.valueOf(m.getRating1()));

             String val2 = db.getUser(m.getRating1());
            finalViewHolder.qty.setText(db.getUser(m.getRating1()));
                db.addtotalcost(String.valueOf(
            Integer.valueOf(val)*m.getRating1()));
            String totalcost = db.getTotalCost2();
            EventBus.getDefault().post(new  
                ChargingEvent(Integer.valueOf(totalcost)));

                }
    });
    // thumbnail image
    viewHolder.thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);

    // title
    viewHolder.title.setText(m.getTitle());

    // rating
    viewHolder.rating.setText("Cost: " + String.valueOf(m.getRating1()));

    // genre
    String genreStr = "";
    for (String str : m.getGenre()) {
        genreStr += str + ", ";
    }
    genreStr = genreStr.length() > 0 ? genreStr.substring(0,
            genreStr.length() - 2) : genreStr;
    viewHolder.genre.setText(genreStr);

    // release year
    //year.setText(String.valueOf(m.getYear()));

    return convertView;
   }
  }

【问题讨论】:

  • 不太确定这到底会影响到哪里,但是您从movieItems 获得电影,然后对其进行一些工作并在数据库上进行一些工作,在此阶段列表movieItems 仍然有效@position 项的旧数据,您需要 1 刷新此列表(从您获得它的位置重新加载)2 更新 m 中的值并添加它到movieItems 在同一位置movieItems.set(position, m); [在m 中设置新值后执行此操作]
  • @yazan 我没明白
  • 你说的值,是在Movie对象中吗?如果是,是哪一个?
  • @yazan 该值不在电影对象中
  • @yazan 忘记回复............谢谢

标签: android listview custom-lists


【解决方案1】:

添加这一行

movieItems.set(position, m);

之后

m.setqty(val1);

这将更新数据集中属性的值,因此适配器会在getView()呈现时查看新数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多