EditText в списке не работает так, как они должны - PullRequest
0 голосов
/ 05 декабря 2010

У меня проблема с полями EditText в ListActivity.

Код соответствует нормальному, но функциональность странная, ввод в первое поле и скрытие клавиатуры после появления текстав другом поле редактирования.

Помогите мне с моей логической проблемой

package com.example.helloandroid;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;

public class AddComp extends ListActivity {


static final int DATE_DIALOG_ID = 0;

        private class EfficientAdapter extends BaseAdapter {
            private LayoutInflater mInflater;
            private String[] attitude_names;
            private String[] attitude_values;

            public EfficientAdapter(Context context) {
                mInflater = LayoutInflater.from(context);
                attitude_names = context.getResources().getStringArray(R.array.COMP_ATTITUDE_NAME);
                attitude_values = new String[attitude_names.length];
            }

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

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

            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;

                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.addcomp_attitude_row, null);

                    holder = new ViewHolder();
                    holder.Attitude_Name = (TextView) convertView.findViewById(R.id.addcomp_att_name);
                    holder.Attitude_Value = (EditText) convertView.findViewById(R.id.addcomp_att_value);

                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }

                holder.Attitude_Name.setText(attitude_names[position]);
                holder.Attitude_Value.setHint(attitude_names[position]);
                attitude_values[position] = holder.Attitude_Value.getText().toString();



                return convertView;
            }

            class ViewHolder {
                TextView Attitude_Name;
                EditText Attitude_Value; 
            }

            @Override
            public int getCount() {
                return attitude_names.length;
            }
        }


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setListAdapter(new EfficientAdapter(this));

        setContentView(R.layout.addcomp);
    }
}

Ответы [ 3 ]

3 голосов
/ 06 декабря 2010

Проблема решена путем добавления Entry в манифест и использования TextWatcher (это необходимо, потому что представление одной строки списка внутренне вызывается несколько раз, что означает, что для 500 записей списка программа использует только несколько экземпляров строки .view-класс будет более эффективным) поэтому для использования массива необходимо использовать наблюдатель текста, который сохраняет измененные данные в дополнительной структуре данных.

        private class EfficientAdapter extends BaseAdapter {
            private LayoutInflater mInflater;
            private String[] attitude_names;
            public String[] attitude_values;
            private String name;

            public EfficientAdapter(Context context) {
                mInflater = LayoutInflater.from(context);
                attitude_names = context.getResources().getStringArray(R.array.COMP_ATTITUDE_NAME);
                attitude_values = new String[attitude_names.length];
            }

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

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

            public View getView(int position, View convertView, ViewGroup parent) {
                final ViewHolder holder;

                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.addcomp_attitude_row, null);

                    holder = new ViewHolder();
                    holder.Attitude_Name = (TextView) convertView.findViewById(R.id.addcomp_att_name);
                    holder.Attitude_Value = (EditText) convertView.findViewById(R.id.addcomp_att_value);
                    holder.Attitude_Value.addTextChangedListener(new TextWatcher()
                        {
                            public void afterTextChanged(Editable edt) 
                            {
                                attitude_values[holder.ref] = edt.toString();
                            }

                            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}

                            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                                //attitude_values[ref] = Attitude_Value.getText().toString();
                            }
                        });

                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }


                holder.ref=position;
                holder.Attitude_Name.setText(attitude_names[position]);
                holder.Attitude_Value.setHint(attitude_names[position]);
                holder.Attitude_Value.setText(attitude_values[position]);




                return convertView;
            }

            class ViewHolder {
                TextView Attitude_Name;
                EditText Attitude_Value; 
                int ref;



            }

            @Override
            public int getCount() {
                return attitude_names.length;
            }
        }
1 голос
/ 18 февраля 2012

Это поможет вам

``

private class EfficientAdapter extends BaseAdapter {
            private LayoutInflater mInflater;
            private String[] attitude_names;
            public String[] attitude_values;
            private String name;
    public static HashMap<Integer,String> myList=new HashMap<Integer,String>();

            public EfficientAdapter(Context context) {
                mInflater = LayoutInflater.from(context);
                attitude_names = context.getResources().getStringArray(R.array.COMP_ATTITUDE_NAME);
                attitude_values = new String[attitude_names.length];
            }
    // initialize myList
    for(int i=0;i<attitude_names.length;i++)
    {
       myList.put(i,"");
    }


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

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

            public View getView(int position, View convertView, ViewGroup parent) {
                final ViewHolder holder;

                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.addcomp_attitude_row, null);

                    holder = new ViewHolder();
                    holder.Attitude_Name = (TextView) convertView.findViewById(R.id.addcomp_att_name);
                    holder.Attitude_Value = (EditText) convertView.findViewById(R.id.addcomp_att_value);
                    holder.Attitude_Value.addTextChangedListener(new TextWatcher()
                        {
                            public void afterTextChanged(Editable edt) 
                            {
                                 myList.put(pos,s.toString.trim());
                                attitude_values[holder.ref] = edt.toString();
                            }

                            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}

                            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                                //attitude_values[ref] = Attitude_Value.getText().toString();
                            }
                        });

                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }


                holder.ref=position;
                holder.Attitude_Name.setText(attitude_names[position]);
                holder.Attitude_Value.setHint(attitude_names[position]);
                holder.Attitude_Value.setText(myList.get(position));




                return convertView;
            }

            class ViewHolder {
                TextView Attitude_Name;
                EditText Attitude_Value; 
                int ref;



            }

            @Override
            public int getCount() {
                return attitude_names.length;
            }
        }

Здесь я включил объект HashMap, который будет следить за тем, что EditText содержит значение. И когда вы прокручиваете просмотр списка, онбудет визуализирован снова путем вызова его метода getView.

В этом коде, когда вы впервые загрузите просмотр списка, весь ваш текст редактирования будет без текста. Как только вы введете какой-то текст, он будет отмечен в myList.So, когдаВы снова визуализируете список, ваш текст будет заблокирован.

0 голосов
/ 05 декабря 2010

Я нашел причину, по которой поведение странной фокусировки нужно добавить android:windowSoftInputMode="adjustPan" в качестве значения к действию в Манифесте Проектов, но, с другой стороны, проблема того, что часто меняется более одного значения поля edid, не решена.RIghtNOw

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...