第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

EditText在ListView中滾動時丟失內容

EditText在ListView中滾動時丟失內容

收到一只叮咚 2019-12-02 13:58:17
我有一個帶有EditText的列表項,我不知道會有多少個項。我在EditText中輸入一些文本,然后向下滾動ListView時遇到問題,再次向上滾動后,第一個EditText中沒有文本,或者ListView中其他EditText中有一些文本。我已經(jīng)嘗試過TextWatcher,并將數(shù)據(jù)保存到數(shù)組中,但是問題是ListView中返回的視圖位置并非總是正確的,因此我從數(shù)組中丟失了一些數(shù)據(jù)。-.-如何在ListView中檢測正確的視圖位置?例如:如果我在ListView中有10個項目,并且當前只有其中5個可見。適配器返回位置從0到4 ...沒關系。當我向下滾動項目6的位置是0 ... wtf?我從位置0的數(shù)組中丟失數(shù)據(jù):)我正在使用ArrayAdapter。請幫忙。這是一些代碼:public View getView(int position, View convertView, ViewGroup parent) {    tmp_position = position;    if (convertView == null) {        holder = new ViewHolder();        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);        convertView = vi.inflate(R.layout.element_in_game, null);        holder.scoreToUpdate = (EditText) convertView                .findViewById(R.id.elementUpdateScore);        holder.scoreToUpdate.addTextChangedListener(new TextWatcher() {            @Override            public void onTextChanged(CharSequence s, int start,                    int before, int count) {                scoresToUpdate[tmp_position] = s.toString();            }            @Override            public void beforeTextChanged(CharSequence s, int start,                    int count, int after) {            }            @Override            public void afterTextChanged(Editable s) {            }        });        initScoresToUpdateEditTexts(holder.scoreToUpdate, hint);        convertView.setTag(holder);    } else {        holder = (ViewHolder) convertView.getTag();        holder.scoreToUpdate.setText(scoresToUpdate[tmp_position]);    }    return convertView;}
查看完整描述

3 回答

?
紅顏莎娜

TA貢獻1842條經(jīng)驗 獲得超13個贊

您應該按以下方式嘗試:


if (convertView == null) {


        holder = new ViewHolder();


        LayoutInflater vi = (LayoutInflater)    

        getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = vi.inflate(R.layout.element_in_game, null);


        holder.scoreToUpdate = (EditText) convertView

                .findViewById(R.id.elementUpdateScore);



        convertView.setTag(holder);


    } else {


        holder = (ViewHolder) convertView.getTag();


    }

   //binding data from array list

   holder.scoreToUpdate.setText(scoresToUpdate[position]);

   holder.scoreToUpdate.addTextChangedListener(new TextWatcher() {


            @Override

            public void onTextChanged(CharSequence s, int start,

                    int before, int count) {

                //setting data to array, when changed

                scoresToUpdate[position] = s.toString();

            }


            @Override

            public void beforeTextChanged(CharSequence s, int start,

                    int count, int after) {


            }


            @Override

            public void afterTextChanged(Editable s) {


            }

        });


    return convertView;

}

說明:ListView的回收行為實際上會在視力不佳時擦除與其行項目綁定的所有數(shù)據(jù)。因此,無論需要從哪個方向重新綁定數(shù)據(jù),每一個新的行都會出現(xiàn)。另外,當EditText文本更改時,還必須將值保留在某些數(shù)據(jù)結構中,因此稍后再次進行行數(shù)據(jù)綁定時,可以提取位置數(shù)據(jù)。您可以使用數(shù)組ArrayList來保留edittext數(shù)據(jù),也可以用于綁定數(shù)據(jù)。


Recyclerview Adapter中使用類似的行為,在邏輯背后,您需要了解適配器的行數(shù)據(jù)的數(shù)據(jù)綁定。


查看完整回答
反對 回復 2019-12-02
?
繁花如伊

TA貢獻2012條經(jīng)驗 獲得超12個贊

如果只有10行,請不要理會ListView。只需將它們垂直放置LinearLayout并用包裹即可,ScrollView這將為您節(jié)省一些麻煩。


如果您要擁有數(shù)十行或數(shù)百行,我建議您想出比行中的EditText窗口小部件更好的UX范例 ListView。


話雖這么說,感覺就像您沒有正確處理行回收,或沒有意識到行被回收。如果您的中有10個項目ListAdapter,并且只有空間顯示5個帶有EditText小部件的行,則EditText當用戶滾動到底部時,不應顯示10 個小部件。您應該以5-7結束-屏幕上的那個,或者當用戶下一次滾動時,另外一個或兩個可以回收。


這個免費的摘錄從我的書一個經(jīng)過創(chuàng)建自定義子類的過程ArrayAdapter,并得到回收利用工作。它還涵蓋了使用RatingBar用戶輸入的交互式行。這比起來容易得多EditText,因為您只需要擔心單擊事件。歡迎您嘗試使用EditText小部件和TextWatcher偵聽器擴展該技術,但我不是粉絲。


查看完整回答
反對 回復 2019-12-02
  • 3 回答
  • 0 關注
  • 742 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號