【问题标题】:ListView shows not correct data when scrolling after update date baseListView 在更新日期后滚动时显示不正确的数据
【发布时间】:2013-03-26 17:36:23
【问题描述】:

我在课程中列出了练习列表。用户可以修改此练习以显示或不显示。当他点击练习时,改变状态(显示或不显示)练习。 对数据库所做的所有更改都可以正常工作。但是当用户进行更改时,当您滚动图片时,“检查​​”在出现的行中显示不正确。

protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);   
 ....
 db = new MyDatabase(this);
 getOnListExes();
 db.close();
}
....
    public  void getOnListExes() {  
    onListExesChek = db.getListExes(prog_man, prog_woman, orderBy);         
    sAdapter = new SimpleCursorAdapter(this, 
            R.layout.exeslist, onListExesChek, 
            new String[] {"exes_bodypart", "exes_name", "exes_name"},  
            new int[] {R.id.exesPartlist_chek, R.id.exesNamelist_chek,
 R.id.chek_img}) {

        public View getView(int position, View convertView, ViewGroup parent) {
                View row = super.getView(position, convertView, parent);
                TextView exesPartlist_chek = 
(TextView) row.findViewById(R.id.exesPartlist_chek);
                TextView exesNamelist_chek = 
(TextView) row.findViewById(R.id.exesNamelist_chek);
                ImageView imageGender = 
(ImageView) row.findViewById(R.id.chek_img);
                return row;
        }
    };
    sAdapter.setViewBinder(new MyViewBinder());
    listExesChek.setAdapter(sAdapter);
   }

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    positionChek = position;
    selectExe_id = Long.toString(id);
    db = new MyDatabase(this);
    onListExesChek = db.getListExes(prog_man, prog_woman, orderBy); 
    onListExesChek.moveToPosition(positionChek);

    if (
onListExesChek.getInt(onListExesChek.getColumnIndex("prog_man_chek")) 
>= Integer.valueOf(prog_man).intValue() &
        onListExesChek.getInt(onListExesChek.getColumnIndex("prog_woman_chek")) 
>= Integer.valueOf(prog_woman).intValue()) {
        if(prog_man.equals("1")) {
            prog_man_chek = new ContentValues();
            prog_man_chek.put("prog_man_chek", "0");    
            int upProg_man_chek = db.setExe(prog_man_chek,
 selectExe_id);
        }
        if(prog_woman.equals("1")) {
            prog_woman_chek = new ContentValues();
            prog_woman_chek.put("prog_woman_chek", "0");
            int upProg_woman_chek = db.setExe(prog_woman_chek,
 selectExe_id);
    } else {
        if(prog_man.equals("1")) {
            prog_man_chek = new ContentValues();
            prog_man_chek.put("prog_man_chek", "1");
            int upProg_man_chek = db.setExe(prog_man_chek,
 selectExe_id); 
        }
        if(prog_woman.equals("1")) {
            prog_woman_chek = new ContentValues();
            prog_woman_chek.put("prog_woman_chek", "1");
            int upProg_woman_chek = db.setExe(prog_woman_chek,
 selectExe_id);
        }
    }
    db.close();
    updateView(position);
}

void updateView(int index){
    db = new MyDatabase(this);
    onListExesChek = db.getListExes(prog_man, prog_woman, orderBy); 
    onListExesChek.moveToPosition(positionChek);
    View v = listExesChek.getChildAt(index - 
            listExesChek.getFirstVisiblePosition());
    if (
    onListExesChek.getInt(onListExesChek.getColumnIndex("prog_man_chek")) 
>= Integer.valueOf(prog_man).intValue() &
    onListExesChek.getInt(onListExesChek.getColumnIndex("prog_woman_chek")) 
>= Integer.valueOf(prog_woman).intValue()
    ) {
        ImageView imageGender = (ImageView) v.findViewById(R.id.chek_img);
        imageGender.setImageResource(R.drawable.check); 
    } else {
        ImageView imageGender = (ImageView) v.findViewById(R.id.chek_img);
        imageGender.setImageResource(R.drawable.notchek);
    }
    db.close();
}

class MyViewBinder implements SimpleCursorAdapter.ViewBinder {  
    public boolean setViewValue (View view, Cursor cursor, int columnIndex) {
        switch (view.getId()) {
        case R.id.chek_img:
            if (onListExesChek.getInt(onListExesChek.
getColumnIndex("prog_man_chek")) 
>= Integer.valueOf(prog_man).intValue() &
onListExesChek.getInt(onListExesChek.getColumnIndex("prog_woman_chek")) 
>= Integer.valueOf(prog_woman).intValue()
                    ) {
                ((ImageView) view).setImageResource(R.drawable.check);
            } else {
                (
(ImageView) view).setImageResource(R.drawable.notchek);
            }     
        return true;
      }
      return false;
    }
  }

【问题讨论】:

    标签: android database listview simplecursoradapter


    【解决方案1】:

    ListViews 回收视图,这意味着首先从 XML 扩充一组基本的列表条目。

    更多检查

    android listview displays false data after scrolling (custom adapter)

    ListView is not showing correct values after scrolling

    两者都适合我

    【讨论】:

      【解决方案2】:

      这是 ListView 的视图回收的副作用。您没有在 getView 方法中设置默认资源,因此 ImageView 将“保留”您在 updateView 方法中设置的任何内容。这种效果在较长的列表中非常明显,您会看到重复的错误状态。

      您应该能够通过在 getView 方法中设置 ImageView 的状态来解决此问题。

      【讨论】:

      • 感谢您的回答!你能给我一个链接,我可以在其中了解如何正确地将 getView 插入到 updateView 方法中?请。我是初学者。
      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 2021-04-29
      • 2013-04-02
      • 1970-01-01
      • 2016-04-07
      • 2018-11-26
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多