2017-02-01 6 views
0

Я пытался получить описание пароля для отображения в TextView в моем ListView - не повезло. Может ли кто-нибудь помочь мне с тем, что мне нужно сделать?Несколько элементов в ArrayAdapter ListView

На данный момент, как вы думаете, мне нужно использовать ArrayList вместо ArrayAdapter?

private static TextView mPasswordView; 
private String mPassword; 
private TextView mPasswordDesc; 
private Button mGeneratepas; 
private ListView mPasswordListView; 
private ArrayAdapter<String> mAdapter; 
private PasswordDBHelper mHelper; 
private PasswordGenerator mPasswordGenerator = new PasswordGenerator(); 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mHelper = new PasswordDBHelper(this); 
    mPasswordView = (TextView) findViewById(R.id.textPassword); 
    mGeneratepas = (Button) findViewById(R.id.buttonGenpas); 
    mPasswordListView = (ListView) findViewById(R.id.list_password); 
    updateList(); 


    mGeneratepas.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      mPassword = mPasswordGenerator.generateSessionKey(8); 
      mPasswordView.setText(mPassword); 
     } 
    }); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    getMenuInflater().inflate(R.menu.main_menu, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_add_task: 
      final EditText passdescEditText = new EditText(this); 
      AlertDialog dialog = new AlertDialog.Builder(this) 
        .setTitle("Add Password to List") 
        .setMessage("Saving Password: " + mPassword) 
        .setView(passdescEditText) 
        .setPositiveButton("Add", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          String password = String.valueOf(mPassword); 
          String passdesc = String.valueOf(passdescEditText.getText()); 
          SQLiteDatabase db = mHelper.getReadableDatabase(); 
          ContentValues values = new ContentValues(); 
          values.put (PasswordContract.PasswordEntry.COL_PASSWORD, password); 
          values.put (PasswordContract.PasswordEntry.COL_PASS_DESC, passdesc); 
          db.insertWithOnConflict(PasswordContract.PasswordEntry.TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE); 
          db.close(); 
          updateList(); 
         } 
        }) 
        .setNegativeButton("Cancel", null) 
        .create(); 
      dialog.show(); 
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 

} 



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()){ 
      int idx = cursor.getColumnIndex(PasswordContract.PasswordEntry.COL_PASSWORD); 
      tasklist.add(cursor.getString(idx)); 
     } 

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

здесь образец изображения:

here is a sample image

ответ

0

ваша проблема здесь:

mAdapter = new ArrayAdapter<>(this, 
       R.layout.item_password, 
       R.id.password, 
       tasklist); 

здесь вы назначаете идентификатор "R.id.password" к адаптеру. Таким образом, адаптер установит текст в идентификаторе, который вы указали. Таким образом, ваше описание пароля не сможет ничего получить. Для описания работы вам необходимо создать пользовательский адаптер.

2

Вам необходимо адаптировать свой список задач, чтобы он содержал объекты с 2 строковыми полями для хранения паролей и связанного с ними описания. Например:

class PasswordItem { 
    String password; 
    String description; 
    PasswordItem(String password, String description){ 
     this.password = password; 
     this.description= description; 
} 

Затем вы заполняете свой список задач с ней:

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

После, для поля mAdapter, необходимо расширить класс ArrayAdapter и переопределить его GetView (Int, View, ViewGroup), чтобы вернуть тип настраиваемого представления, которое вы хотите (этот метод будет вызывать для создания каждой строки вашего ListView).

Например:

@override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // Check if an existing view is being reused, otherwise inflate the view 
    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_password, parent, false); 
    } 

    TextView passwordView = (TextView) convertView.findViewById(R.id.password); 
    TextView passwordDescriptionView = (TextView) convertView.findViewById(R.id.description); // Use the id your chose for the password description view 

    // We are extracting the PasswordItem at the right 'position' from the tasklist 
    PasswordItem passwordItem = getItem(position); 

    // Now can set the texts for each view 
    passwordView.setText(passwordItem.password); 
    passwordDescriptionView.setText(passwordItem.description); 

    // Return the completed view to render on screen 
    return convertView; 
    } 
} 
+0

Я работаю над этим Оливье. Позвольте мне посмотреть, работает ли это. Спасибо. –

Смежные вопросы