2014-02-07 73 views
0

你能幫我簡單的例子嗎?我有文本框和2 iagebutton listitem,我怎麼可以將偵聽器綁定到我的按鈕,而無需通過null寫入新的自定義適配器(我希望覆蓋只是simplecursoradapter)。 對不起,我的硬漢語,我希望,你給我清楚,簡單的理解例子。listview中的按鈕與simplecursoradapter

public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cursor> { 

ListView lvForms; 
dbForm table_form; 
SimpleCursorAdapter scAdapter; 

/** 
* Called when the activity is first created. 
*/ 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    table_form=new dbForm(this); 
    table_form.open(); 


    String[] from = new String[]{DBHelper.FORM_NAME, DBHelper.FORM_TITLE}; 
    int[] to = new int[]{R.id.tvFormName, R.id.tvFormTitle}; 


    scAdapter = new SimpleCursorAdapter(this, R.layout.listform_item, null, from, to, 0); 
    lvForms = (ListView) findViewById(R.id.lvForms); 
    lvForms.setAdapter(scAdapter); 


    registerForContextMenu(lvForms); 


    getSupportLoaderManager().initLoader(0, null, this); 
} 

// обработка нажатия кнопки 
public void onButtonClick(View view) { 
      Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
      startActivity(intent); 
} 

protected void onDestroy() { 
    super.onDestroy(); 
    table_form.close(); 

} 

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) { 
    return new MyCursorLoader(this, table_form); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    scAdapter.swapCursor(cursor); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
} 

static class MyCursorLoader extends CursorLoader { 

    dbForm table_form; 

    public MyCursorLoader(Context context, dbForm table_form) { 
     super(context); 
     this.table_form = table_form; 
    } 

    @Override 
    public Cursor loadInBackground() { 
     Cursor cursor = table_form.getAllData(); 
     return cursor; 
    } 

} 

}

UPD:我編寫自定義類

class MySimpleCursorAdapter extends SimpleCursorAdapter { 
    public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 
     super(context, layout, c, from, to, flags); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView != null) { 
      return convertView; 
     } 

     return LayoutInflater.from(context).inflate(R.layout.listform_item); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME)); 

     TextView text = (TextView) findViewById(R.id.tvFormName); 
     text.setText(name); 

     Button yourButton = (Button) findViewById(R.id.ibtnDelete); 
     yourButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

      } 
     }); 


    } 
} 

但對return LayoutInflater.from(context).inflate(R.layout.listform_item);錯誤,你能告訴我怎麼現在使用監聽器的按鍵(刪除項,例如)?如何獲取我們點擊按鈕的項目數量?

回答

2

唐`在重寫簡單的遊標適配器和其他光標適配器使用getView。您必須重寫newView和bindView方法。 這是我工作的代碼

public View newView(Context _context, Cursor _cursor, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) _context.getSystemService(_context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.listform_item, parent, false); 
    return view; 
} 

@Override 
public void bindView(View view, Context Context, Cursor cursor) { 
    String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME)); 
    String title = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_TITLE)); 
    TextView formname = (TextView) view.findViewById(R.id.tvFormName); 
    formname.setText(name); 
    TextView formtitle = (TextView) view.findViewById(R.id.tvFormTitle); 
    formtitle.setText(title); 
    ImageButton yourButton = (ImageButton) view.findViewById(R.id.ibtnDelete); 
    yourButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (view != null) { 
       Object obj = view.getTag(); 
       //if(obj != null && obj instanceof Integer) { 
       dbForm form = new dbForm(context); 
       form.open(); 
       String st = obj.toString(); 
       form.deleteForm(Long.valueOf(st).longValue()); 
       Toast.makeText(context, "Delete row with id = " + st, Toast.LENGTH_LONG).show(); 

      } 
     } 
    }); 
    Object obj = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_ID)); 
    yourButton.setTag(obj); 
} 
+0

yes,根據 http://developer.android.com/training/contacts- provider/display-contact-badge.html 您必須重寫'newView()'和'bindView()'方法。 –

0

你必須子類SimpleCursorAdapter。 覆蓋兩種方法getViewbindView

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView != null) { 
     return convertView; 
    } 

    return LayoutInflater.from(context).inflate(R.layout.listform_item); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME)); 

    TextView text = (TextView) viewfindViewById(R.id.tvFormName); 
    text.setText(name); 

    Button yourButton = (Button) viewfindViewById(R.id.magic_button); 
    yourButton.setOnClickListener(new View.OnClickListener(){ //implement listener here}); 
} 
+0

非常感謝你,但怎麼樣的ImageButton?IM didn't明白的地方是我必須連接的按鍵處理程序(onButtonClick或其他)?請告訴我/ – mechanikos

+0

我更新了我的帖子 –

+0

非常感謝!哦,我在早上做,因爲現在3:55上午 – mechanikos