2017-04-05 3 views
0

Guten Tag zu löschen,Android benutzerdefinierte listadapter immer das letzte Element

Ich versuche, mein Wissen in Android Programmierung
, indem Sie eine einfache Notiz-App mit benutzerdefinierten Adapter Liste zu aktualisieren.

Mein Problem ist, auch ich „NotifyDataSetChanged();“,
der Wert in meiner Liste gelöscht ist immer die letzte.
Obwohl wenn ich es aktualisiere, wird es das richtige anzeigen.

Hier ist mein Code:

public class CustomAdapter extends BaseAdapter{ 
List<Memo> memos; 
Context context; 
int [] imageId; 


private static LayoutInflater inflater = null; 
public CustomAdapter(MainActivity mainActivity, List<Memo> _memos) { 
    memos = _memos; 
    context = mainActivity; 
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
@Override 
public int getCount() { 
    return memos.size(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

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

public class Holder 
{ 
    TextView tv; 
    TextView tv2; 
    Button deleteMemoBtn; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    Holder mViewHolder = null; 

    if (convertView == null) { 
     mViewHolder = new Holder(); 
     LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     convertView = vi.inflate(R.layout.list_memo, parent, false); 
     mViewHolder.tv = (TextView) convertView.findViewById(R.id.textView1); 
     mViewHolder.tv2 = (TextView) convertView.findViewById(R.id.textView2); 
     mViewHolder.deleteMemoBtn = (Button) convertView.findViewById(R.id.deleteMemoBtn); 

     mViewHolder.tv.setText(memos.get(position).getMemoTitle()); 
     mViewHolder.tv2.setText(Integer.toString(memos.get(position).getMemoID())); 

     mViewHolder.tv.setOnClickListener(new OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "You Clicked " + memos.get(position).getMemoTitle(), Toast.LENGTH_LONG).show(); 
      } 
     }); 



     mViewHolder.deleteMemoBtn.setOnClickListener(new OnClickListener() {    
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "deleted " + Integer.toString(position), Toast.LENGTH_LONG).show(); 
       memos.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 


    } 
    return convertView; 
} 


} 

der Hoffnung, jemand kann mir erhellen, warum dieser Code funktioniert nicht.
Danke!

+0

zeigt der Toast die korrekte gelöschte Position? –

+0

@PhanVanLinh, habe ich die "memos.get (position)" zu "Integer.toString (position)" bearbeitet, so kann ich es richtig überprüfen, und ja, der Toast zeigt jetzt die richtige Position an. Ich habe 4 Artikel in meinem Array und wenn ich auf die dritte Zeile in meiner Liste klicke, wird "deleted 2" angezeigt (das ist der dritte Artikel) –

+0

Ich überprüfe deinen Code und denke, dass er korrekt ist. Haben Sie Demo-Projekt, wenn möglich teilen Sie es bitte –

Antwort

1

Versuchen Sie diesen Code.

public class CustomAdapter extends BaseAdapter { 
    List<Memo> memos; 
    Context context; 
    int[] imageId; 


    private LayoutInflater inflater = null; 

    public CustomAdapter(Context mainActivity, List<Memo> _memos) { 
     memos = _memos; 
     context = mainActivity; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return memos.get(position); 
    } 

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

    public class Holder { 
     TextView tv; 
     TextView tv2; 
     Button deleteMemoBtn; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     Holder mViewHolder = null; 

     if (convertView == null) { 
      mViewHolder = new Holder(); 

      convertView = inflater.inflate(R.layout.list_memo, parent, false); 
      mViewHolder.tv = (TextView) convertView.findViewById(R.id.textView1); 
      mViewHolder.tv2 = (TextView) convertView.findViewById(R.id.textView2); 
      mViewHolder.deleteMemoBtn = (Button) convertView.findViewById(R.id.deleteMemoBtn); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (Holder) convertView.getTag(); 
     } 

     mViewHolder.tv.setText(memos.get(position).getMemoTitle()); 
     mViewHolder.tv2.setText(Integer.toString(memos.get(position).getMemoID())); 
     mViewHolder.tv.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "You Clicked " + memos.get(position).getMemoTitle(), Toast.LENGTH_LONG).show(); 
      } 
     }); 
     mViewHolder.deleteMemoBtn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "deleted " + Integer.toString(position), Toast.LENGTH_LONG).show(); 
       memos.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 


     return convertView; 
    } 


} 
+0

funktioniert wie ein Charme! macht das 'else { mViewHolder = (Holder) convertView.getTag(); } 'ist mein Problem? –

+0

Ja. Du hast nur den letzten Viewholder gehalten. –

Verwandte Themen