2012-03-31 15 views
3

Ich habe eine Listenansicht mit benutzerdefinierten Zeile mit einer Textansicht und einem anklickbaren Bild zum Löschen der Zeile. Listview ruft die Daten von der SQLite-Datenbank ab. Ich habe die Daten erfolgreich aus der Datenbank in die Listenansicht geladen. Ich möchte diese Zeile aus der Datenbank löschen, wenn die Schaltfläche Löschen gedrückt wird. Ich weiß, dass das Onclick-Event-Handler an die Lösch-Schaltfläche binden muss und das Objekt oder die SQLite-Daten mit der Zeile gebunden werden müssen. Wie kann ich die sqlite-Daten mit der Zeile verknüpfen, in der der Benutzer auf die Schaltfläche zum Löschen geklickt hat? Hier ist mein Adapter zur ListenansichtLöschen der ausgewählten Zeile in der Listenansicht in Android

public class CommentAdapter extends ArrayAdapter<Comment> { 

// private objects 
private List<Comment> mListComment; 
private LayoutInflater mInflater; 

public CommentAdapter(Context c,int textViewResourceId, List<Comment> list) { 
    super(c, textViewResourceId, list); 
    mListComment = list; 
    // create layout inflater 
    mInflater = LayoutInflater.from(c); 
} 

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

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // get view reference 
    View view = convertView; 
    // if null 
    if(view == null) { 
     // inflate new layout 
     view = mInflater.inflate(R.layout.comment_row, null); 
     // create a holder 
     ViewHolder holder = new ViewHolder(); 
     // find controls 
     holder.txtComment = (TextView)view.findViewById(R.id.txtComment); 
     holder.btnDelete = (ImageView)view.findViewById(R.id.btnDelete); 
     // set data structure to view 
     view.setTag(holder); 
    } 

    Comment cmt = mListComment.get(position); 
    // if not null 
    if(cmt != null) { 
     // query data structure 
     ViewHolder holder = (ViewHolder)view.getTag(); 
     // set data to display 
     holder.txtComment.setText(cmt.getComment()); 
     holder.btnDelete.setClickable(true); 
     holder.btnDelete.setImageResource(android.R.drawable.ic_delete); 

    } 

    // return view 
    return view; 
} 

/* 
* @class ViewHolder 
* to hold data structure on view with comment info 
*/ 
static class ViewHolder { 
    private TextView txtComment; 
    private ImageView btnDelete; 

} 
} 

Hier meine CommentsDataSource Klasse ist

public class CommentsDataSource { 
private SQLiteDatabase database; 
private DatabaseHelper dbHelper; 
private String[] allColumns = { DatabaseHelper.COLUMN_ID, DatabaseHelper.COLUMN_COMMENT }; 

public CommentsDataSource(Context context) { 
    dbHelper = new DatabaseHelper(context); 
} 

public void open() throws SQLException { 
    database = dbHelper.getWritableDatabase(); 
} 

public void close() { 
    dbHelper.close(); 
} 

public Comment createComment(String comment) { 
    //insert into databasae 
    return newComment; 
} 

private Comment cursorToComment(Cursor cursor) { 
    //convert cursor to comment 
    return comment; 
} 

public void deleteComment(Comment comment) { 
    //delete row from datbase 
} 


public List<Comment> getAllComments() { 
    //get all rows 
    return comments; 
} 

} 
+0

Sie benötigen einen Cursor-Adapter, der an Ihre Datenbank bindet. Änderungen an Ihrer Datenbank spiegeln sich in Ihrem Cursor-Adapter wider. Löschen oder Einfügen in die Datenbank würde dann in Ihrer Liste widerspiegeln. – ComputerEngineer88

Antwort

2

Mobify Ihre getView Methode wie unten funktioniert:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // get view reference 
    View view = convertView; 
    // if null 
    if(view == null) { 
     // inflate new layout 
     view = mInflater.inflate(R.layout.comment_row, null); 
     // create a holder 
     ViewHolder holder = new ViewHolder(); 
     // find controls 
     holder.txtComment = (TextView)view.findViewById(R.id.txtComment); 
     holder.btnDelete = (ImageView)view.findViewById(R.id.btnDelete); 
     // set data structure to view 
     view.setTag(holder); 
    } 

    final Comment cmt = mListComment.get(position); 
    // if not null 
    if(cmt != null) { 
     // query data structure 
     ViewHolder holder = (ViewHolder)view.getTag(); 
     // set data to display 
     holder.txtComment.setText(cmt.getComment()); 
     holder.btnDelete.setClickable(true); 
     holder.btnDelete.setImageResource(android.R.drawable.ic_delete); 
     holder.btnDelete.setOnClickListener(new View.OnClickListener(){ 
       public void onClick(View view) 
       { 
        commentsDataSource.deleteComment(cmt); 
        //Requery DB to get Updated results 
        notifyDataSetChanged(); 
       } 
     }) 

    } 

    // return view 
    return view; 
} 
+0

innerhalb der onclick-Event-Handler, wenn ich auf CMT-Objekt verweisen, erhalte ich eine Fehlermeldung, wie kann nicht auf eine nicht endgültige Variable cmt innerhalb einer inneren Klasse in einer anderen Methode definiert verweisen. könnte helfen – rockstar

+0

ok, machen Sie es endgültig – jeet

+0

@just erklären Sie Ihre 'Comment cmt' in Ihrer Klasse nicht in 'getView' Methode. – Herry

0

Sie benötigen onlistitemclicklistener in Ihren erweiterten ListActivity einzustellen. Es wäre so etwas.

Jetzt machen Sie Ihren Handler, um die ausgewählte Zeile zu löschen. Sie haben listview, current view und die indexed id. Hoffe, es wird

0

schreiben einen Listener für Taste klicken und im onClick() -Methode, verwenden Sie diesen Code:

@Override 
protected void onClick(View view){ 
    view.getParent().setVisibility(View.GONE); 
} 

Ich hoffe, Das wird für dich funktionieren. Alternativ, wie ich habe keine Zeit, um den obigen Code zu überprüfen, wenn das nicht funktioniert, in der getView() Methode können Sie die view und die Schaltfläche in zwei separate ArrayList speichern, dann erhalten Sie den Index der Schaltfläche in der onClick() Klicken Sie auf die Schaltfläche ArrayList, und legen Sie die Sichtbarkeit desselben Index in der Ansicht ArrayList als GONE fest. Diese Methode ist etwas dreckig, also bevorzuge ich die obige Methode.

-1
Listview.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
     // TODO Auto-generated method stub 
     List.remove(position); 
     notifyDataSetChanged(); 
    } 
}); 
+0

Vielleicht ist dies hilfreich, um die Frage zu beantworten, die Sie brauchen erklären, wie Sie Ihre Lösung verwenden und warum dies das Problem löst – Soma

Verwandte Themen