2015-05-21 31 views
0

當我向下/向上滾動這麼快時,位置變化太快以至於弄亂了該位置的項目,導致文本改變而不是原來的內容。我已經搜索了修復程序,但似乎無法找出它出錯的地方。下面是我的自定義代碼ArrayAdapterListView項目在Scroll上的位置更改

import android.content.Context; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.TextView; 

import java.util.ArrayList; 

import aungkyawpaing.ngapyinkeyboard.Models.CustomKey; 
import aungkyawpaing.ngapyinkeyboard.R; 
import butterknife.ButterKnife; 
import butterknife.InjectView; 

/** 
* Created by Vincent on 16-Apr-15. 
*/ 
public class CustomKeyAdapter extends ArrayAdapter<CustomKey> { 

    private int size; 
    ArrayList<CustomKey> datas = new ArrayList<>(); 

    public CustomKeyAdapter(Context context, ArrayList<CustomKey> list) { 
     super(context, R.layout.listitem_customkey, list); 
     size = list.size(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder viewHolder; 

     if (convertView != null) { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } else { 
      LayoutInflater layoutInflater = 
        (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = layoutInflater.inflate(R.layout.listitem_customkey, parent, false); 
      viewHolder = new ViewHolder(convertView); 
      convertView.setTag(viewHolder); 
     } 
     CustomKey key = getItem(position); 
     datas.add(position, key); 

     viewHolder.txt_number.setText("Key #" + (position + 1) + " : "); 
     viewHolder.value_field.setText(key.getOutput()); 
     viewHolder.value_field.addTextChangedListener(new MyTextWatcher(position)); 

     return convertView; 
    } 

    private class MyTextWatcher implements TextWatcher { 

     private int position; 

     public MyTextWatcher(int position) { 
      this.position = position; 
     } 

     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      CustomKey key = getItem(position); 
      key.setOutput(editable.toString()); 
      datas.add(position, key); 
     } 
    } 

    static class ViewHolder { 
     @InjectView(R.id.custom_key_number) TextView txt_number; 
     @InjectView(R.id.custom_key_value) EditText value_field; 

     public ViewHolder(View view) { 
      ButterKnife.inject(this, view); 
     } 
    } 

    public ArrayList<CustomKey> getValues() { 
     return datas; 
    } 
} 

編輯:TextView的是好的,它只是在那的EditText不斷變化

+1

(https://www.google.co.in/search?q=android+listview+scrolling+issue&oq=android+listview+scrolling+issue&aqs=chrome..69i57。 9863j0j9&sourceid = chrome&es_sm = 93&ie = UTF-8)[鏈接] .. –

+0

我在Google之前詢問過。 :)大多數答案告訴改變與我的模式完全相同的viewholder模式 –

+0

您必須爲ViewHolder使用單獨的類。該持有人應該是私人的。同樣的問題,我面臨和解決..! [Link](http://stackoverflow.com/questions/28486148/how-to-solve-scroll-issue-in-gridview-in-android).. –

回答

1

添加TextWatcherEditText去除EditText現有TextWatcher之前的文本。
TextWatcher

static class ViewHolder { 
     @InjectView(R.id.custom_key_number) TextView txt_number; 
     @InjectView(R.id.custom_key_value) EditText value_field; 
     MyTextWatcher myWatcher; 
     public ViewHolder(View view) { 
      ButterKnife.inject(this, view); 
     } 
    } 

現在刪除EditText現有TextWatcher,初始化視圖保持器的TextWatchergetView()方法並添加TextWatcher到的EditText

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

     if (convertView != null) { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } else { 
      LayoutInflater layoutInflater = 
        (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = layoutInflater.inflate(R.layout.listitem_customkey, parent, false); 
      viewHolder = new ViewHolder(convertView); 
      convertView.setTag(viewHolder); 
     } 
     CustomKey key = getItem(position); 
     datas.add(position, key); 

     viewHolder.txt_number.setText("Key #" + (position + 1) + " : "); 
     viewHolder.value_field.setText(key.getOutput()); 
     //Remove the myWatcher 
     viewHolder.value_field.emoveTextChangedListener(myWatcher); 
     viewHolder.myWatcher=new MyTextWatcher(position); 
     //add the myWatcher 
     viewHolder.value_field.addTextChangedListener(myWatcher); 

     return convertView; 
    } 
+0

仍在改變滾動,但謝謝。應該實現的守望者應該是這樣的 –

+0

你已經保存了一個名爲的數據,它有什麼用處呢? – Kartheek

+0

getValues由具有此佈局的活動調用,並將這些值從edittext保存到數據庫中。它在用戶點擊保存菜單選項時調用。數據用於存儲這些自定義鍵 –

0

我已經解決了問題。我會像「onTextChanged」中那樣,關鍵是引用視圖中的項目。因此setOutput會更改該鍵輸出。解決了該問題與下面的代碼

public void afterTextChanged(Editable editable) { 
    CustomKey key = getItem(position); 
    datas.add(position, new CustomKey(key.getCode(), editable.toString())); 
}