Подтвердить что ты не робот

Редактировать в Listview android

У меня есть Listview с editext и textview.

Когда я касаюсь edittext, тогда edittext потерял фокус!

Я решил эту проблему, установив android:windowSoftInputMode="adjustPan"(AndroidManifest.xml). Теперь я касаюсь edittext, а editext получает фокус, но ярлык приложения и некоторая часть списков исчезают (верхняя часть).

Я хочу получить фокус, когда пользователь прикасается к edittext без метки приложения потерь и некоторого сырья listview.

Код, который я реализовал:

Ниже кодирования вы получаете фокус, когда пользователь прикасается к edittext, но ярлык приложения и некоторая часть списка исчезают, когда появляется мягкая клавиатура. Я хочу получить фокус, когда пользователь прикасается к edittext без метки приложения потерь и некоторого сырья списка.

1) AndroidManifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyListViewDemoActivity"
                  android:label="@string/app_name"
                  android:windowSoftInputMode="adjustPan"
                  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

</application>

2) raw_layout.xml

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <EditText android:id="@+id/mEditText"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  />  
</LinearLayout>

3) main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView android:id="@+id/mListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>

4) MyListViewDemoActivity

public class MyListViewDemoActivity extends Activity {
    private ListView mListView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mListView=(ListView)findViewById(R.id.mListView);
        mListView.setAdapter(new MyAdapter(this));
    }
}

class MyAdapter extends BaseAdapter {

    private Activity mContext;
    private String character[]={"a","b","c","d","e","f","g","h","i","j"};
    public MyAdapter(Activity context)
    {
        mContext=context;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return character.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
private class Holder
{
    EditText mEditText;
}
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        final Holder holder;
        if (convertView == null) {
            holder = new Holder();
            LayoutInflater inflater =mContext.getLayoutInflater();
            convertView = inflater.inflate(R.layout.raw_layout, null);
            holder.mEditText = (EditText) convertView
                    .findViewById(R.id.mEditText);
            convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();
        }
        holder.mEditText.setText(character[position]);
        holder.mEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                // TODO Auto-generated method stub
                if (!hasFocus){
                    final EditText etxt = (EditText) v;
                    holder.mEditText.setText(etxt.getText().toString());
                }

            }
        });
        return convertView;
    }

}
4b9b3361

Ответ 1

У меня была такая же проблема. Моя цифровая клавиатура мгновенно появится перед заменой на клавиатуру qwerty и потерять фокус EditText.

Проблема заключается в том, что появление клавиатуры приводит к потере фокуса EditText. Чтобы это не помешало, выполните следующие действия в вашем AndroidManifest.xml для соответствующего действия (или действий):

android:windowSoftInputMode="adjustPan"

См. Android документация:

Когда метод ввода появляется на экране, он уменьшает объем свободного места для вашего пользовательского интерфейса приложения. Система принимает решение о том, как она должна корректировать видимую часть вашего пользовательского интерфейса, но это может оказаться неправильным. Чтобы обеспечить наилучшее поведение для вашего приложения, вы должны указать, как вы хотите, чтобы система отображала ваш пользовательский интерфейс в оставшемся пространстве.

Чтобы объявить ваше предпочтительное лечение в действии, используйте атрибут android:windowSoftInputMode в вашем манифесте <activity> с одним из значений "adjust".

Например, чтобы система изменила размер вашего макета на доступное пространство, что гарантирует доступность всего вашего содержимого макета (хотя, вероятно, это требует прокрутки) -use "adjustResize"

Ответ 2

Не видя свой код, как мы можем предложить возможное решение вашей проблемы. Поэтому продолжайте практиковать публикацию возможных кодов всякий раз, когда вы задаете любой вопрос.

Однако здесь я нашел один учебник для реализации Android Focusable EditText внутри ListView. Пройдите пример и попытайтесь реализовать на своем пути или узнайте решение проблемы.

Ответ 3

Я решил проблему "Внести EditText в ListView как элемент" в последнее время. Я не очень хорошо разбираюсь в английском. Поэтому, если что-то я не объясню, объясните, пожалуйста, пожалуйста.

Мы знаем, что ListView можно прокручивать по вертикали, и мы хотим поместить EditText в ListView в качестве элемента.

Во-первых: Добавить

android: windowSoftInputMode = "adjustResize"

в вашем AndroidManifest.xml при активности node.

Второе: Мы создаем pojo в качестве источника данных модели для управления состоянием EditText

Line.java

public class Line{
    int num;
    String text;
    boolean focus;

    get set method and so on...
}

Третье: Мы пишем адаптер для адаптации EditText к ListView.

Элемент item_line.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frameLayout"
    android:layout_width="match_parent"
    android:layout_height="80dp">

    <EditText
        android:id="@+id/etLine"
        android:focusable="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"/>
</FrameLayout>

Adapter:

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
    final ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_line, parent, false);
        holder.etLine = (EditText) convertView.findViewById(R.id.etLine);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    final Line line = lines.get(position);

    // step 1: remove android.text.TextWatcher added in step 5 to make sure android.text.TextWatcher 
    //         don't trigger in step 2;
    // why?
    // 
    // note: When an object of a type is attached to an Editable, 
    //       TextWatcher methods will be called when the EidtText text is changed.
    //       
    //       EditText use a ArrayList<TextWatcher> type object to store the listener, so we must
    //       make sure there only one TextWatcher object in this list;
    // 
    // Avoid triggering TextWatcher method in step 2 we remove it at first time.
    // 
    if (holder.etLine.getTag() instanceof TextWatcher) {
        holder.etLine.removeTextChangedListener((TextWatcher) (holder.etLine.getTag()));
    }

    // step 2: set text and focus after remove android.text.TextWatcher(step 1);
    holder.etLine.setHint(position + ".");

    // set text
    if (TextUtils.isEmpty(line.getText())) {
        holder.etLine.setTextKeepState("");
    } else {
        holder.etLine.setTextKeepState(line.getText());
    }

    // set focus status
    // why?
    //
    // note: ListView has a very elegant recycle algorithm. So views in ListView is not reliable.
    //       Especially in this case, EditText is an item of ListView. Software input window may cause
    //       ListView relayout leading adapter getView() invoke many times.
    //       Above all if we change EditText focus state directly in EditText level(not in Adapter). 
    //       The focus state may be messed up when the particularly view reused in other position. 
    //       
    //       So using data source control View state is the core to deal with this problem.   
    if (line.isFocus()) {
        holder.etLine.requestFocus();
    } else {
        holder.etLine.clearFocus();
    }

    // step 3: set an OnTouchListener to EditText to update focus status indicator in data source
    // why?
    // 
    // in step 2, we know we must control view state through data source. We use OnTouchListener
    // to watch the state change and update the data source when user move up fingers(ACTION_UP).
    // We don't want to consume the touch event, simply return false in method onTouch().
    holder.etLine.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                check(position);
            }
            return false;
        }
    });

    // step 4: set TextWatcher to EditText to listen text changes in EditText to updating the text in data source
    // why?
    // 
    // again, use data source to control view state.
    // When user edit the text in one EditText item and scroll the ListView. The particularly EditText item will be
    // reuse in adapter getView(), this may lead text messed up in ListView.
    // How to deal with this problem?
    // Easy! We update the text in data source at the same time when user is editing. TextWatcher is the best way to
    // do this.
    final TextWatcher watcher = new SimpeTextWather() {

        @Override
        public void afterTextChanged(Editable s) {
            if (TextUtils.isEmpty(s)) {
                line.setText(null);
            } else {
                line.setText(String.valueOf(s));
            }
        }
    };
    holder.etLine.addTextChangedListener(watcher);

    // step 5: Set watcher as a tag of EditText.
    // so we can remove the same object which was setted to EditText in step 4;
    // Make sure only one callback is attached to EditText
    holder.etLine.setTag(watcher);

    return convertView;
}

/**
 * change focus status in data source
 */
private void check(int position) {
    for (Line l : lines) {
        l.setFocus(false);
    }
    lines.get(position).setFocus(true);
}

static class ViewHolder {
    EditText etLine;
}

Все сделано!

Вы можете прочитать более подробную информацию в моем github.

Демо: https://github.com/Aspsine/EditTextInListView

Ответ 4

ListView воссоздайте представление, Попробуйте использовать LinearLayout внутри ScrollView, затем в вашем коде используйте runOnUiThread, чтобы заполнить ваш вид в другом потоке, подобном этому

public void fillDataTask(Context context, final LinearLayout listView) {

        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {

                fillView(context, listView);
            }
        });
    }



    private void fillView(Context context, LinearLayout listView) {
            MyAdapter adapter = new MyAdapter(context);
            final int adapterCount = adapter.getCount();
            for (int i = 0; i < adapterCount; i++) {
                View item = adapter.getView(i, null, null);
                listView.addView(item);
            }

    }

Ответ 5

        <ListView 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false" 
        android:id="@+id/list1" 
        android:layout_weight="1"
        android:cacheColorHint="#00000000" 
        android:focusable="false"                   
        >
        </ListView>