2013-03-31 3 views
0

Я использую следующий код, чтобы показать окно редактирования в спискеРедактирование текста странное поведение в ListView

Моего каждый элемент ListView содержит следующий шаблон

[EditText 1] [EditText 2] [EditText 3 ][EditText 4][EditText 5] 



     class CustomArrayAdapterForScore extends ArrayAdapter<ScoreModel> 
     { 
      public CustomArrayAdapterForScore() 
      { 
       super(MeetScore.this, R.layout.score_event_layout, myScoreArray); 
      } 

      @Override 
      public View getView(final int position, View convertView, ViewGroup parent) 
      { 
        View view = null; 
        LayoutInflater inflator = MeetScore.this.getLayoutInflater(); 
        view = inflator.inflate(R.layout.score_event_layout, parent, false); 
        final ViewHolder viewHolder = new ViewHolder(); 

        viewHolder.title = (TextView) view.findViewById(R.id.title); 

        viewHolder.box1 = (EditText) view.findViewById(R.id.box1); 
        viewHolder.box2 = (EditText) view.findViewById(R.id.box2); 
        viewHolder.box3 = (EditText) view.findViewById(R.id.box3); 
        viewHolder.box4 = (EditText) view.findViewById(R.id.box4); 
        viewHolder.box5 = (EditText) view.findViewById(R.id.box5); 
        viewHolder.box6 = (EditText) view.findViewById(R.id.box6); 

        viewHolder.box1.addTextChangedListener(new TextWatcher() 
        { 
         public void onTextChanged(CharSequence c, int arg1, int arg2, int arg3) 
         { 
          ScoreModel score = myScoreArray.get(position); 
          score.box1 = Integer.valueOf(viewHolder.box1.getText().toString()); 
          myScoreArray.set(position, score); 
          listView.invalidateViews(); 
         } 
         public void beforeTextChanged(CharSequence c, int arg1, int arg2, int arg3){} 
         public void afterTextChanged(Editable arg0){} 
        }); 

    view.tag(viewHolder); 
return view; 

Whenver изменить текст EditBox, нажмите на него и писать с помощью клавиатуры, e, g, если я пишу 9, он показывает 9, но как только клавиатура исчезнет, ​​текст почти исчез. Текст редактирования показывает пустое пространство.

Что не так?

+0

Я не уверен, почему это происходит, если это не связано с тем, что вы вызываете 'invalidateViews()' в свой 'ListView', не сохраняя то, что находится в' EditText'. Но из того, что я вижу, вы не используете свой «ViewHolder» правильно. Вы каждый раз воссоздаете 'Просмотры', но' ViewHolder' так вам не нужно каждый раз воссоздавать их из ваших 'ресурсов'. Вы должны сохранить каждый «Просмотр» в своем классе «ViewHolder», а затем использовать его, чтобы получить ссылку на ваши «Просмотры» в других случаях – codeMagic

+0

вы можете объяснить с помощью кода? –

+0

недействительные представления были добавлены для тестирования, я удалил его, и он показывает то же самое. проверьте отредактированный код –

ответ

0
  1. Что такое точка с помощью View держателя, когда вы не повторно использовать convertView, вы всегда надувания новый вид.

  2. Я вижу звонок listView.invalidateViews() в getView(). Это может привести к тому, что ListView будет признан недействительным для каждого текста. По недействительности вызывается getView() и к присоединяется новый TextChangedListener. Все такие Слушатели делают то же самое n раз, рецепт хаоса.

  3. Кроме того, вы не устанавливаете текст с того места, где вы его сохранили (myScoreArray), когда вы раздуваете представления.

+0

listView.invalidateViews(), который добавлен в тест. без него, тот же ответ. –

+0

Я устанавливаю каждый viewHolder в тег для просмотра, а затем возвращаю вид –

0

Это не то, как вы используете ViewHolder. Это, как вы должны использовать:

public View getView(...) 
{ 
View rootView=convertView; 
ViewHolder holder; 
if(rootView==null) 
    { 
    rootView=inflater.... 
    rootView.setTag(holder =new ViewHolder()); 
    //... 
    } 
else holder=(ViewHolder) rootView.getTag(); 
//... 
} 

EditText в ListView является проблематичным, так как это приводит к тому, элементы ListView двигаться из-за softKeyboard. Либо установите манифест:

android:windowSoftInputMode="adjustPan" 

(Я не уверен, что это правильное значение). Или сделайте диалог для редактирования выбранного элемента.