2013-10-24 2 views
4

У меня есть listview с одним textview и edit text в каждой строке. Если я устанавливаю значение в одном текстовом поле редактирования, а затем при прокрутке вниз, я получаю дублирующее значение этого введенного значения поля в другом текстовом поле редактирования. Как я могу решить эту проблему?Android List View duplicates Редактировать Текстовые значения при прокрутке

Моего класса адаптер, как показано ниже:

public class CustomAdapter extends ArrayAdapter<String> { 
    private Context  context; 
    private String[] names; 
    ViewHolder holder; 

    static class ViewHolder { 
    public TextView text; 
    public EditText editText; 
    } 

    public CustomAdapter(Context context, int textViewResourceId, String[] names) { 
    super(context, textViewResourceId, names); 
    this.context = context; 
    this.names = names; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.row_design, parent, false); 
     holder = new ViewHolder(); 
     holder.text = (TextView) convertView.findViewById(R.id.textView1); 
     holder.editText = (EditText) convertView.findViewById(R.id.editText1); 
     convertView.setTag(holder);   
    } else {    
     holder = (ViewHolder) convertView.getTag(); 
    } 

    String s = names[position]; 
    holder.text.setText(s); 
    return convertView; 
    } 
} 

Я передал эту ссылку: Listview duplicate action, Android listview duplicates the item on scroll

ответ

0

Попробуйте этот код ниже:

public class CustomAdapter extends ArrayAdapter<String> { 
    private Context  context; 
    private String[] names; 

    static class ViewHolder { 
    public TextView text; 
    public EditText editText; 
    } 

    public CustomAdapter(Context context, int textViewResourceId, String[] names) { 
    super(context, textViewResourceId, names); 
    this.context = context; 
    this.names = names; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowView = inflater.inflate(R.layout.row_design, parent, null); 
     ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) rowView.findViewById(R.id.textView1); 
     viewHolder.editText = (EditText) rowView.findViewById(R.id.editText1); 
     rowView.setTag(viewHolder);   
    }   
     ViewHolder holder = (ViewHolder)rowView.getTag(); 


    String s = names[position]; 
    holder.text.setText(s); 
    return rowView; 
    } 
} 

Для получения дополнительной информации см This link.

Надеюсь, это вам поможет.

+0

Я уже пробовал это тоже, но не работает :( – akashpatra

0

Это лучшее, о чем я еще мог думать. Но попробуйте это как обходной путь. Я согласен с тем, что решение этой проблемы может быть лучше/чище.

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

Прежде всего, вы можете изменить данные на List вместо массива и внести изменения, как показано ниже.

List<String> names; 
List<String> edit; 

// In Constructor() 
this.names = names; 
// Create a list with empty data for the editTexts 
int listSize = names.size(); 
String emptyString = new String(""); 
List<String> emptyList = new ArrayList<String>(listSize); 
for(int i = 0; i < listSize; i ++){ 
    emptyList.add(emptyString); 
} 
this.edit = emptyList; 

// In getView() 
// add watcher to editText and when it is changed, update the value in 'edit' 
// Simply set the corresponding values to this row to the editText 
holder.text.setText(names.get(position)); 
holder.editText.setText(edit.get(position)); 

Вы видите, что это разрешает вашу проблему в краткосрочной перспективе.

Вы можете увидеть, как использовать смотрел из этого ответа https://stackoverflow.com/a/11181721/592025

+0

я пытался с кодом, но тем же результатом :( – akashpatra

0

Update:

Мое первоначальное решение ниже будет работать для этого случая использования, но гораздо лучшим решением является то, что из ViewHolder рисунка , о чем говорил HailNaRoz. Хотя HailNaRoz не объясняет, почему его решение работает, это решение использует ViewHolder для повторного использования View и является предпочтительным методом, принятым Google и сообществом Android Dev. В ViewHolder содержится ссылка на Views (EditText, TextView, ImageView и т. Д.) И позволяет добавлять их обратно в правильную строку списка, когда она становится видимой.

Его также стоит посмотреть на RecyclerView, который с тех пор был представлен для облегчения некоторых из этих вопросов, что заставляет эту методологию. RecyclerView доступен в качестве поддержки библиотеки, которые могут быть добавлены в Gradle

См View Holder in List View и Creating Lists and Cards (Recycler View)

Оригинал:

Ваша проблема заключается в том, что ваш EditText перерабатывается. Вы сохраняете копию своего текста TextView и сбрасываете его каждый раз, когда он загружается, но не для вашего EditText.

Так что вам нужен способ сохранить текст в поле EditText и сбросить его в getView().

Чтобы сделать это, вы хотите настроить TextWatcher после, если/другое заявление в getView():

holder.editText.addTextChangedListener(new TextWatcher() { 

      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 
      } 

      public void beforeTextChanged(CharSequence s, int start, 
        int count, int after) { 
      } 

      public void afterTextChanged(Editable s) { 
        editTextList.put(position,s.toString()); 
      } 
     }); 

Это сохраняет значение в HashMap поддерживается отдельно. position взято из параметра int в вашем методе getView(). Вам нужно будет сделать это окончательным.

HashMap:

private HashMap<Integer,String> editTextList =new HashMap<Integer,String>(); 

Затем, когда вы установите TextView текст, который вы также хотите установить EditText значение:

holder.text.setText(s); 
holder.editText.setText(editTextList.get(position)); 

Это должно сохранить текущие позиции editText значение в правильном EditText окне ,

+0

Спасибо Biddulph за ответ, но это не работает для меня это работает.. для тебя ? – akashpatra

+1

Эта настройка работает для меня. Пробовали ли вы отладку и следили за тем, чтобы значения, входящие/выходящие из editTextList, присутствовали и что прослушиватель TextWatcher попал правильно? –

5

Во-первых Причина этого вопроса ListView Повторное использование его взгляд, когда свитки, Таким образом, мы должны иметь логику, на наш взгляд ПОЛУЧИТЬ управлять этим

if(convertview == null) 
{ 
//code here 
}else { 
//code here 
}  

, но если вы не хотите использовать, то вы можете использование следующее:

@Override 
    public int getItemViewType(int position) { 
    return position; 
} 

@Override 
public int getViewTypeCount() { 
    return 500; 
} 
+0

Что здесь 500, можем ли мы его изменить. plz объясните –

+0

Если нам нужно показать другой тип вида в представлении списка, тогда его полезно использовать getViewTypeCount() Здесь вы можете использовать 0, так как вы хотите показывать только один вид в listview – GOLDEE

+0

Если вы действительно хотите использовать этот ** getViewTypeCount ** взломать (что очень очень ... очень плохо), потому что не происходит повторного вызова), вы должны установить ** getViewTypeCount **, чтобы вернуть размер элементов ... – Marko