2017-03-07 11 views
1

Ich versuche die Texteingabe für die Passwortbeschreibung zu erhalten, um die Array-Ansicht meiner App zu füllen.Arraylist kann nicht angewendet werden

enter image description here

Leider für Teil meiner while (cursor.movetoNext()) sagt, dass mein String kann nicht in Arraylist angewandt werden. Ich versuche zu bestimmen, was ich in meiner updateList-Methode ändern muss, um mein Passwort-Element anzupassen.

Hier ist meine Update-Liste-Methode.

private void updateList(){ 
      ArrayList<String> tasklist = new ArrayList<>(); 
      SQLiteDatabase db = mHelper.getReadableDatabase(); 
      Cursor cursor = db.query(PasswordContract.PasswordEntry.TABLE, new String[]{PasswordContract.PasswordEntry._ID, PasswordContract.PasswordEntry.COL_PASSWORD, PasswordContract.PasswordEntry.COL_PASS_DESC}, 
        null, null, null, null, null); 

      while (cursor.moveToNext()){ 
       String password = cursor.getString(cursor.getColumnIndex(PasswordContract.PasswordEntry.COL_PASSWORD)); 
       String description = cursor.getString(cursor.getColumnIndex(PasswordContract.PasswordEntry.COL_PASS_DESC)); 
       tasklist.add(new PasswordItem(password, description)); 

if (mAdapter == null){ 
      mAdapter = new ArrayAdapter<>(this, 
        R.layout.item_password, 
        R.id.password, 
        R.id.password_description, 
        tasklist); 
      mPasswordListView.setAdapter(mAdapter); 
}else{ 
      mAdapter.clear(); 
      mAdapter.addAll(String.valueOf(tasklist)); 
      mAdapter.notifyDataSetChanged(); 
     } 
     cursor.close(); 
     db.close(); 

Ich versuche herauszufinden, wie ich meinen Customadapter an meine updatelist-Methode anschließe.

public class CustomAdapter extends ArrayAdapter<String>{ 

    private Context mContext; 
    private List<String> mStringList; 
    public CustomAdapter(Context context, List<String> mStringList) { 
     super(context, R.layout.item_password); 
     this.mContext = context; 
     this.mStringList = new ArrayList<>(); 
     this.mStringList = mStringList; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.item_password, parent, false); 

     TextView your_first_text_view = (TextView) convertView.findViewById(R.id.password); 
     TextView your_second_text_view = (TextView) convertView.findViewById(R.id.password_description); 

     your_first_text_view.setText(mStringList.get(position)); 
     your_second_text_view.setText(mStringList.get(position)); 
     return convertView; 
    } 

Antwort

3

Sie verwenden POJO Klasse nicht String so tun, um die erforderlichen Änderungen in Adapter sowie in der Liste Typ

Verwendung dieses

ArrayList<PasswordItem> tasklist = new ArrayList<>(); 

statt

ArrayList<String> tasklist = new ArrayList<>(); 

Plus mAdapter sollte so von CustomAdapter Typ sein

erklären es wie CustomAdapter mAdapter und später als

mAdapter = new CustomAdapter(this, R.layout.item_password ,tasklist); 

und in Ihrem Adapter initialisieren

public class CustomAdapter extends ArrayAdapter<PasswordItem>{ 
//            ^^^^^^^ 
    private Context mContext; 
    private List<PasswordItem> mStringList; 
    //   ^^^^^^^ 
    public CustomAdapter(Context context, int resource , List<PasswordItem> mStringList) { 
     super(context, resource , mStringList); 
     this.mContext = context; 
     //this.mStringList = new ArrayList<>(); not required 
     this.mStringList = mStringList; 
    } 

    public updateList(List<PasswordItem> mStringList){ 
     this.mStringList = mStringList; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.item_password, parent, false); 

     TextView your_first_text_view = (TextView) convertView.findViewById(R.id.password); 
     TextView your_second_text_view = (TextView) convertView.findViewById(R.id.password_description); 

     your_first_text_view.setText(mStringList.get(position).password); 
     // use your getter or field names of POJO class 
     your_second_text_view.setText(mStringList.get(position).description); 
     return convertView; 
    } 

und diese mAdapter.addAll(String.valueOf(tasklist)); so Ihr Code zu ersetzen

if (mAdapter == null){ 
     mAdapter = new CustomAdapter(this, 
       tasklist); 
     mPasswordListView.setAdapter(mAdapter); 
}else{ 
     mAdapter.clear(); 
     mAdapter.updateList(tasklist); 
     // pass the new list to adapter 
     mAdapter.notifyDataSetChanged(); 
    } 
+0

Pavneet, fast da. Ich habe if-and-else-Anweisungen zu meiner updatelist-Methode hinzugefügt. Ich habe meinen Beitrag aktualisiert, um sie zu zeigen. Der Arrayadapter teilt mit, dass Argumente nicht abgeleitet werden können. Hast du eine Vorstellung davon, was das verursacht? –

+0

Es sagt immer noch Array-Adapter kann nicht angewendet werden. –

+0

warten, ich habe es, lassen Sie mich aktualisieren –

1

Wenn Sie Elemente zu einer Arraylist hinzufügen, müssen sie vom selben Typ wie der definierte Typ sein. Sie haben arraylist mit type string definiert, fügen aber ein PasswordItem-Objekt hinzu. Ändern Sie den Arraylist Typ PasswordItem statt zu halten:

ArrayList<PasswordItem> tasklist 
Verwandte Themen