Android 将多个元素添加到ListView的ArrayAdapter

Android 将多个元素添加到ListView的ArrayAdapter,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我一直在试图让密码描述显示在我的ListView中的TextView中,但运气不好。有人能帮我做点什么吗 此时,您认为我需要使用ArrayList而不是ArrayAdapter吗 private static TextView mPasswordView; private String mPassword; private TextView mPasswordDesc; private Button mGeneratepas; private ListView mPasswordListView

我一直在试图让密码描述显示在我的ListView中的TextView中,但运气不好。有人能帮我做点什么吗

此时,您认为我需要使用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();
私有静态文本视图mPasswordView;
私有字符串mPassword;
私有文本视图mPasswordDesc;
专用按钮;
私有ListView mPasswordListView;
私人ArrayaAdapter mAdapter;
私人密码dbhelpermhelper;
私有密码生成器mPasswordGenerator=新密码生成器();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHelper=新密码dbhelper(this);
mPasswordView=(TextView)findViewById(R.id.textPassword);
mgGeneratePas=(按钮)findViewById(R.id.ButtongePas);
mPasswordListView=(ListView)findViewById(R.id.list\u密码);
updateList();
mgGeneratePas.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mPassword=mPasswordGenerator.generateSessionKey(8);
mPasswordView.setText(mPassword);
}
});
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单.主菜单,菜单);
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例R.id.action\u add\u任务:
final EditText passdescEditText=新的EditText(此);
AlertDialog=新建AlertDialog.Builder(此)
.setTitle(“将密码添加到列表”)
.setMessage(“保存密码:+mPassword”)
.setView(passdescEditText)
.setPositiveButton(“添加”,新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
字符串密码=String.valueOf(mPassword);
String passdesc=String.valueOf(passdescEditText.getText());
SQLiteDatabase db=mHelper.getReadableDatabase();
ContentValues=新的ContentValues();
values.put(PasswordContract.PasswordEntry.COL_PASSWORD,PASSWORD);
values.put(PasswordContract.PasswordEntry.COL\u PASS\u DESC,passdesc);
db.insertWithOnConflict(PasswordContract.PasswordEntry.TABLE,null,value,SQLiteDatabase.CONFLICT\u REPLACE);
db.close();
updateList();
}
})
.setNegativeButton(“取消”,null)
.create();
dialog.show();
返回true;
违约:
返回super.onOptionsItemSelected(项目);
}
}
私有void updateList(){
ArrayList tasklist=新建ArrayList();
SQLiteDatabase db=mHelper.getReadableDatabase();
Cursor Cursor=db.query(PasswordContract.PasswordEntry.TABLE,新字符串[]{PasswordContract.PasswordEntry.\u ID,PasswordContract.PasswordEntry.COL\u PASSWORD,PasswordContract.PasswordEntry.COL\u PASS\u DESC},
空,空,空,空,空,空);
while(cursor.moveToNext()){
int idx=cursor.getColumnIndex(PasswordContract.PasswordEntry.COL\u PASSWORD);
tasklist.add(cursor.getString(idx));
}
if(mAdapter==null){
mAdapter=新阵列适配器(此,
R.layout.item_密码,
R.id.password,
任务清单);
mPasswordListView.setAdapter(mAdapter);
}否则{
mAdapter.clear();
mAdapter.addAll(任务列表);
mAdapter.notifyDataSetChanged();
}
cursor.close();
db.close();
以下是示例图像:


您的问题在于:

mAdapter = new ArrayAdapter<>(this,
               R.layout.item_password,
               R.id.password,
               tasklist);
mAdapter=新阵列适配器(此,
R.layout.item_密码,
R.id.password,
任务清单);

您正在将id“R.id.password”分配给适配器。因此适配器将在您提供的id中设置文本。因此,您的密码说明将无法获取任何内容。要使说明生效,您需要自定义适配器。

您的问题在于:

mAdapter = new ArrayAdapter<>(this,
               R.layout.item_password,
               R.id.password,
               tasklist);
mAdapter=新阵列适配器(此,
R.layout.item_密码,
R.id.password,
任务清单);

这里您正在分配id“R.id.password”适配器。因此适配器将在您提供的id中设置文本。因此,您的密码说明将无法获取任何信息。要使说明生效,您需要自定义适配器。

您需要调整任务列表,使其包含具有两个字符串字段的对象,用于存储密码及其相关说明。 例如:

class PasswordItem {
    String password;
    String description;
    PasswordItem(String password, String description){
        this.password = password;
        this.description= description;
}
@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;
    }
}
然后用它填充任务列表:

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的每一行)

例如:

class PasswordItem {
    String password;
    String description;
    PasswordItem(String password, String description){
        this.password = password;
        this.description= description;
}
@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;
    }
}

您需要调整任务列表,使其包含具有两个字符串字段的对象,用于存储密码及其相关描述。 例如:

class PasswordItem {
    String password;
    String description;
    PasswordItem(String password, String description){
        this.password = password;
        this.description= description;
}
@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;
    }
}
然后用它填充任务列表:

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的每一行)

例如:

class PasswordItem {
    String password;
    String description;
    PasswordItem(String password, String description){
        this.password = password;
        this.description= description;
}
@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;
    }
}

我正在做,奥利弗。让我看看它是否有效。谢谢。我正在做,奥利弗。让我看看它是否有效。谢谢。