1

In my application I use SimpleCursorAdapter. If CheckBox.isChecked() then text should be strikethrough. But why then the first line is always crossed out, even if the CheckBox is not checked

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);

        }
    }
}

I put a flag in textView in functoin getView() txtTitle.setPaintFlags(txtTitle.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); txtTitle1.setPaintFlags(txtTitle.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); Why is the first line is always crossed out?

4

1 回答 1

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);
    }
于 2013-04-05T07:22:10.063 回答