为什么第一行总是划掉?

时间:2013-04-05 06:48:04

标签: android

在我的应用程序中,我使用SimpleCursorAdapter。如果CheckBox.isChecked()那么文字应该是删除线。但是为什么第一行总是被划掉,即使未检查CheckBox

public class MainActivity extends Activity {
//  Button btnCalendar;

//*******************************************8
String[] names = {"Иван", "Марья", "Петр", "Антон", "Даша", "Борис",
          "Костя", "Игорь", "Анна", "Денис", "Андрей"};
//Button buttonAddTask;
final String Tag="States";
final String Ten = "Ten";
TextView txtDataTaskToday;
String id_for_listtsk_today;
ListView lvMain_today;
String[] arr_date;
SharedPreferences sPref;
static Cursor c;
private ListView listView = null;
SQLiteDatabase db;
//public static String id_for_listtsk_today;
//  static SQLiteDatabase db;
MySqlCursorAdapter adapter = null;
//***********************************************8

@Override
protected void onCreate(Bundle savedInstanceState) {
    if (getIntent().getBooleanExtra("finish", false)) finish();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
//  btnCalendar = (Button) findViewById(R.id.btnActTwo);
//  btnCalendar.setOnClickListener(this);

    //*********************************************
    // переменные для query
    String[] columns = null;
    String selection = null;
    String[] selectionArgs = null;
    String groupBy = null;
    String having = null;
    String orderBy = null;

  //*********работа с БД****************
    // создаем объект для данных

        txtDataTaskToday = (TextView) findViewById(R.id.txtDataTaskToday);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String id_for_listtsk_today = sdf.format(new Date());
        //final String b = id_for_listtsk_today;
        txtDataTaskToday.setText("Today: "+id_for_listtsk_today.toString());
    //  txtDataTaskToday.setPaintFlags(txtDataTaskToday.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

        Log.d(Tag, "id_for_listtsk_today ="+id_for_listtsk_today );
        ContentValues cv = new ContentValues();
        DBHelper dbHelper = new DBHelper(this);     
        final SQLiteDatabase db = dbHelper.getWritableDatabase();
        columns = new String[] {"name"};
        selection = "data_id = ?";
        selectionArgs = new String[] {id_for_listtsk_today};
        //c = db.query("mytable", columns, selection, selectionArgs, null, null, null);
        try {
        c=dbHelper.getCursor(id_for_listtsk_today);
        } catch (SQLException sqle) {
            Log.d(Tag, "неудача");
            throw sqle;

        }
        String[] arr_date = logCursor(c);

    //*********работа с БД****************  

        lvMain_today = (ListView) findViewById(R.id.list);
//            lvMain_today.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        //this.listView=getl
        //listView = MainActivity.this.getlgetListView();
        lvMain_today.setItemsCanFocus(false);
        lvMain_today.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        //ArrayAdapter<String> adapter =  new ArrayAdapter<String>    (this,android.R.layout.simple_list_item_multiple_choice, arr_date);// R.layout.item, my_list_item
        startManagingCursor(c);
        int[] listFields = new int[] { R.id.txtTitle, R.id.txtDataTaskToday };
        String[] dbColumns = new String[] { DBHelper.COLUMN_NAME, DBHelper.COLUMN_TASK };
        Log.d(Tag, "трассировка" );
        MainActivity.this.adapter = new MySqlCursorAdapter(
                this, R.layout.my_list_item,
                c, dbColumns, listFields,
                dbHelper);
//           
        lvMain_today.setAdapter(MainActivity.this.adapter);
    //    setListAdapter(MainActivity.this.adapter);




        names = arr_date;
        //c.close();
        //db.close();
        //dbHelper.close();



        lvMain_today.setOnItemClickListener(new OnItemClickListener() {
              public void onItemClick(AdapterView<?> parent, View view,
                  int position, long id) {
                  TextView txtView = (TextView) findViewById(R.id.txtTitle);
                  txtView.setText("blah blah blah");
                  Log.d(Tag, "position="+position);
                //  ((TextView)     txtDataTaskToday).setTextColor(android.R.color.white);
                  SparseBooleanArray chosen = ((ListView)     parent).getCheckedItemPositions();
                  for (int i = 0; i < chosen.size(); i++) {
                      int key = chosen.keyAt(i);
                      if (chosen.get(key))
                        Log.d(Tag, "выделены ====="+names[key]);
                  Log.d(Tag, "itemClick: position = " + position + ", id = "
                    + id);}


                //****************nen пробная фигня**************

//                  String[] columns = null;
//                  String selection = null;
//                  String[] selectionArgs = null;
//                  String groupBy = null;
//                  String having = null;
//                  String orderBy = null;
//                  columns = new String[] {"name"};
//                  selection = "data_id = ?";
//                  selectionArgs = new String[]     {id_for_listtsk_today};//id_for_listtsk_today 
//                  Cursor c = db.query("mytable", columns, selection, selectionArgs, null, null, null);
             //   String[] arr = logCursor(c);
                 //**************************************************  
                  //  String s=test();   
              }

            });

//          lvMain_today.setOnItemSelectedListener(new OnItemSelectedListener() {
//                public void onItemSelected(AdapterView<?> parent, View view,
//                    int position, long id) {
//                  Log.d(Tag, "Было выделение позиции меню!!!!position = " + position + ", id = "
//                      + id);
//                }
//
//                public void onNothingSelected(AdapterView<?> parent) {
//                  Log.d(Tag, "itemSelect: nothing");
//                }
//              }); 
}

private String[] logCursor(Cursor c) {
    // TODO Auto-generated method stub
    final String Tag="States";
    String[] arr_date = new String[c.getCount()];//String[] arr_date  = new String[] {};
    Log.d(Tag,"мы в курсоре");
    if (c!=null) {
        if (c.moveToFirst()) {
        //  Log.d(Tag,"мы в курсоре1");
            String str;
            int i=-1;
            do {
            //  Log.d(Tag,"мы в курсоре2");
                str="";
                i=i+1;
                for (String cn: c.getColumnNames()) {
                    str = str.concat(c.getString(c.getColumnIndex(cn)));
                }
                Log.d(Tag, "++++"+str);
                arr_date[i]=String.valueOf(str);
            } while (c.moveToNext());

        } 
    }

    return arr_date;

}




@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    menu.add(0, 1, 0, "календарь");
    menu.add(0, 2, 0, "Убрать выполненные");
    menu.add(0, 3, 3, "Уйти");
//        menu.add(1, 4, 1, "copy");
//        menu.add(1, 5, 2, "paste");
//        menu.add(1, 6, 4, "exit");

      return super.onCreateOptionsMenu(menu);
//  getMenuInflater().inflate(R.menu.main, menu);
    //return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
      // TODO Auto-generated method stub
      StringBuilder sb = new StringBuilder();

      // Выведем в TextView информацию о нажатом пункте меню 
     // txtDataTaskToday.setText("Item Menu");
    //  txtDataTaskToday.setText(item.getGroupId());
      txtDataTaskToday.setText("\r\n itemId: " + String.valueOf(item.getItemId()));
     // txtDataTaskToday.setText("\r\n order: " + String.valueOf(item.getOrder()));
     // txtDataTaskToday.setText("\r\n title: " + item.getTitle());
      switch (item.getItemId()) {
    case 1:
        Intent intent = new Intent(this, ToDoCalendarActivity.class);
        startActivity(intent);
        onDestroy();
        break;
    case 2:

        SparseBooleanArray sbArray = lvMain_today.getCheckedItemPositions();
        for (int i = 0; i < sbArray.size(); i++) {
          int key = sbArray.keyAt(i);
          if (sbArray.get(key))
            Log.d(Tag, "выделены "+names[key]);
          sPref = getPreferences(MODE_PRIVATE);
          Editor ed = sPref.edit();
          ed.putString(Ten, "1");
          ed.commit();
          Log.d(Tag, "ставим константу для скрытия");
        }


        break;
    case 3:
        sPref = getPreferences(MODE_PRIVATE);
        String savedText = sPref.getString(Ten, "");
        Log.d(Tag, "ten= "+ savedText);
        onDestroy();
        //finish();
        break;

    }

      return super.onOptionsItemSelected(item);
    }

@Override
  protected void onStart() {
    super.onStart();
    try {
        MainActivity.this.onRestart();
    } catch (Exception e) {
        Log.d(Tag, "не получилось рестартануть");
    }
    Log.d(Tag, "MainActivity: onStart()");
  }



  @Override
  protected void onResume() {
    super.onResume();
    Log.d(Tag, "MainActivity: onResume()");
  }

protected void onDestroy() {
    super.onDestroy();
    // закрываем подключение при выходе
  //  ToDoCalendarActivity.this.finish();
    Log.d(Tag, "MainActivity: onDestroy()");
    finish();

 //   db.close();
  }
@Override
protected void onPause() {

    super.onPause();
    //this.dbHelper.close();
    Log.d(Tag, "MainActivity: onPause()");
}
@Override
  protected void onStop() {
    super.onStop();
    Log.d(Tag, "MainActivity: onStop()");
  }
@Override
protected void onRestart() {
    super.onRestart();
//  new SelectDataTask().execute();
    Log.d(Tag, "MainActivity: onRestart()"); 

}

//  @Override
//  public void onClick(View v) {
//      // TODO Auto-generated method stub
//      switch (v.getId()) {
//      case R.id.btnActTwo:
//          
//          Intent intent = new Intent(this, ToDoCalendarActivity.class);
//          startActivity(intent);
//          break;
//      }
//  }

}

MySqlCursorAdapter

public class MySqlCursorAdapter extends SimpleCursorAdapter implements OnClickListener {
    final String Tag="States";
    private Context context;

    private DBHelper dbHelper;
    private Cursor currentCursor;
    TextView txtTitle;
    TextView txtTitle1;

    public MySqlCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to, DBHelper dbHelper) {

        super(context, layout, c, from, to);
        Log.d(Tag, "трассировка1" );
        this.currentCursor = c;
        this.context = context;
        this.dbHelper = dbHelper;
        Log.d(Tag, "MySqlCursorAdapter()");
        Integer b = c.getCount();
        Log.d(Tag, "b="+b);
    }

    public View getView(int pos, View inView, ViewGroup parent) {
        Log.d(Tag, "getView() + posss=" + pos);
        View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.my_list_item, null);
        }

        this.currentCursor.moveToPosition(pos);

        CheckBox cBox = (CheckBox) v.findViewById(R.id.bcheck);

        cBox.setTag(Integer.parseInt(this.currentCursor.getString(this.currentCursor.getColumnIndex(DBHelper.COLUMN_ID))));
        Log.d(Tag, "tag="+cBox.getTag().toString());
        if (this.currentCursor.getString(this.currentCursor
            .getColumnIndex(DBHelper.COLUMN_STATUS)) != null
            && Integer.parseInt(this.currentCursor
                .getString(this.currentCursor
                        .getColumnIndex(DBHelper.COLUMN_STATUS))) != 0) {
            cBox.setChecked(true);
        } else {
            cBox.setChecked(false);
        }

        cBox.setOnClickListener(this);

        txtTitle = (TextView) v.findViewById(R.id.txtTitle);
        txtTitle1 = (TextView) v.findViewById(R.id.txtDataTaskToday);
        txtTitle.setText(this.currentCursor.getString(this.currentCursor.getColumnIndex(DBHelper.COLUMN_NAME)));
        txtTitle1.setText(this.currentCursor.getString(this.currentCursor.getColumnIndex(DBHelper.COLUMN_TASK)));
        if (cBox.isChecked()) {
            Log.d(Tag, " pos=" + pos);
            txtTitle.setPaintFlags(txtTitle.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);    
            txtTitle1.setPaintFlags(txtTitle.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        }

        return (v);
    }

    public void ClearSelections() {
        Log.d(Tag, "ClearSelections()");
        this.dbHelper.clearSelections();
        this.currentCursor.requery();
    }

    @Override
    public void onClick(View v) {
        if(dbHelper.dbSqlite==null) {
            //Log.d(Tag, "00000000000");
            SQLiteDatabase db = dbHelper.getWritableDatabase();    
            //Log.d(Tag, "onClick");
            CheckBox cBox = (CheckBox) v;
            Integer _id = (Integer) cBox.getTag();
            //Integer _id = 4;
            //Log.d(Tag, "Integer _id="+_id.toString());
            ContentValues values = new ContentValues();
            values.put(" status", cBox.isChecked() ? 1 : 0);
            try {
               db.update("mytable", values, "_id = ?",    new String[] { Integer.toString(_id) });
            } catch (SQLException sqle) {
                //    Log.d(Tag, "неудача");
                throw sqle;
            }
        }

        txtTitle.setTextColor(Color.BLUE);

        }
    }
}

我在functoin getView()的textView中放了一个标志 txtTitle.setPaintFlags(txtTitle.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); txtTitle1.setPaintFlags(txtTitle.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 为什么第一行总是划掉?

1 个答案:

答案 0 :(得分:4)

setPaintFlags更改是持久的,所以我怀疑你的函数被调用两次,第一次执行cBox.setChecked(true),但第二次执行cBox.setChecked(false),所以标志不是重启。因此:

    if (cBox.isChecked())
    {
        Log.d(Tag, " pos=" + pos);
        txtTitle.setPaintFlags(txtTitle.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);    
        txtTitle1.setPaintFlags(txtTitle.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
    }
    else
    {
        Log.d(Tag, "!pos=" + pos);
        txtTitle.setPaintFlags(txtTitle.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);    
        txtTitle1.setPaintFlags(txtTitle.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
    }