1

を使用notifyDataSetChangedして、リスト ビューを更新して、リスト ビューの 1 行をパスワード ドットからプレーン テキストに変更し、パスワード ドットに戻そうとしています。

私のアダプター(ここのコメントに基づいて変更)で、その行にあるオブジェクトのタイプを確認します。行がパスワードの場合、私はそれを設定しました

setTransformationMethod(new PasswordTransformationMethod()); 

パスワードテキストをドットに変えるため。アクティビティの後半でその行をクリックすると、タイプが「notPass」に変わります。リストビューを更新しnotifyDataSetChangedて、表示されるテキストとして表現しようとしています。

public class UserAccountAdapter extends ArrayAdapter<UserAccountData> {
    Context context;
    int layoutResourceId;
    UserAccountData data[] = null;
    TreeSet<String> mSeparatorsSet = new TreeSet<String>();

    public UserAccountAdapter(Context context, int layoutResourceId,
            UserAccountData[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        UserAccountDataHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new UserAccountDataHolder();
            holder.imgIcon = (ImageView) row.findViewById(R.id.imgUserAccountIcon);
            holder.txtTitle = (TextView) row.findViewById(R.id.txtTitle);


            row.setTag(holder);
        } else {
            holder = (UserAccountDataHolder) row.getTag();
        }

        UserAccountData userAccountData = data[position];
        holder.txtTitle.setText(userAccountData.title); 
        //hold

er.txtTitle.setTransformationMethod(new PasswordTransformationMethod());
            holder.imgIcon.setImageResource(userAccountData.icon);
        if(userAccountData.type.equals("pass")){

            ((TextView) row.findViewById(R.id.txtTitle)).setTransformationMethod(new PasswordTransformationMethod());
        }
        else{
            ((TextView) row.findViewById(R.id.txtTitle)).setTransformationMethod(null);
        }


        return row;
    }

    static class UserAccountDataHolder {
        ImageView imgIcon;
        TextView txtTitle;
    }
    }

アダプターに与えるオブジェクトは次のとおりです。

public class UserAccountData {
    public int icon;
    public String type;
    public String title;
    public UserAccountData(){
        super();
    }

    public UserAccountData(int icon, String title, String type) {
        super();
        this.icon = icon;
        this.title = title;
        this.type = type;
    }
    public void setType(String type){
        this.type = type;
    }

}

そして、clickListener を扱う私のアクティビティ部分は次のとおりです。

 usersArray = new UserAccountData[user_data.size()];
 user_data.toArray(usersArray);

 final UserAccountAdapter adapter = new UserAccountAdapter(this,
                                        R.layout.user_accounts_row, usersArray);

 userAccountsListView = (ListView) findViewById(R.id.userAccounts);
 userAccountsListView.setAdapter(adapter);

 userAccountsListView.setOnItemClickListener(new OnItemClickListener() {
        @Override
            public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            if(adapter.getItem(position).type.equals("pass")){
                adapter.getItem(position).setType("notPass");
                adapter.notifyDataSetChanged();


            }
            else if(adapter.getItem(position).type.equals("notPass")){
                adapter.getItem(position).setType("pass");
                adapter.notifyDataSetChanged();

            }

現在、ドット付きのパスワード フィールドをクリックすると、そのフィールドはドットのままであり、ユーザー/メール/電話タイプの他のフィールドのすべてではありませんが一部もドットに変わります。

私は何が間違っているのですか?

更新: 問題を解決しました。1) if / if ではなく、else if が必要でした。2)コメントの1つに基づいてアダプターを変更しました

4

1 に答える 1

2

getView メソッドのアダプタ クラスでは、「パスなし」タイプのフィールドの変換をリセットしません。

if(userAccountData.type.equals("notPass")){
        holder.txtTitle.setTransformationMethod(null);
    }

位置を配列インデックスとして直接使用する代わりに、「getItemAtPositionMethod」で関連データを取得できます

listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

        UserAccountData uad = (UserAccountData)parent.getItemAtPosition(position);
            //your code

        });

各 getView 呼び出しで値を直接設定してみてください。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    UserAccountDataHolder holder = null;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
    }

    UserAccountData userAccountData = data[position];
    TextView tvTitle = (TextView) row.findViewById(R.id.txtTitle);

    if(userAccountData.type.equals("pass")){
        tvTitle.setTransformationMethod(new PasswordTransformationMethod());
    }

    if(userAccountData.type.equals("notPass")){
        tvTitle .setTransformationMethod(null);
    }
 }

}

于 2013-01-28T16:13:05.263 に答える