2015-10-04 148 views
0

我在列表視圖中有多個編輯文本。編輯文本的數量不固定。列表視圖滾動時,編輯文本會丟失其內容或其他一些焦點對齊的編輯文本顯示其他一些編輯文本的值。我嘗試過堆棧溢出提供的解決方案,但沒有任何幫助。編輯文本在滾動列表視圖中丟失內容

我已經聲明瞭一個哈希映射,我在其中存儲位置和值,然後在哈希映射的編輯文本中設置文本,但某處哈希映射覆蓋之前存儲的位置的值。

如果需要密碼,請讓我知道。我會用我的代碼更新我的問題。

更新我的問題與我的代碼,我有tried-

public class JunkTabAdapter extends ArrayAdapter<JunkTabBean> { 

    private Activity mContext; 
    /* android.graphics.Typeface face; */ 
    private int listItemForFile; 
    private static ArrayList<JunkTabBean> itemList = new ArrayList<JunkTabBean>(); 

    private ListView download_row; 
    ImageLoader imageloader; 
    long fileLength; 
    String getImage, saveinternalImagePath; 
    Bitmap getBitmapImage; 
    HomeLoader hl; 
    NewImageLoader img; 
    String fromWhere; 

    String value=""; 
    String qty=""; 
    List<Integer> totAmtList = new ArrayList<Integer>(); 
    JunkTab junkTab; 
    public int totAmt=0; 

    ViewHolder holder; 

    Map<Integer,String> map = new HashMap<Integer,String>(); 
    int count=0; 
    public JunkTabAdapter(Activity context, int listItemForFile, 
      ArrayList<JunkTabBean> itemList,String fromWhere,JunkTab junkTab) { 
     super(context, listItemForFile, itemList); 
     this.mContext = context; 
     this.listItemForFile = listItemForFile; 
     this.itemList = itemList; 
     this.fromWhere=fromWhere; 
     this.junkTab=junkTab; 

     img=new NewImageLoader(context); 
    } 

    public int getCount() { 
     return itemList.size(); 
    } 

    public JunkTabBean getItem(JunkTabBean position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public class ViewHolder { 

     public ImageView imgItem; 
     public ImageView imgInfo; 
     public ImageView imgDel; 
     public EditText edQty; 
     public TextView tvAmt; 
     public TextView tvTotAmt; 
     public View viewDivider; 

     int reference; 

    } 
    // create a new ImageView for each item referenced by the Adapter 
    public View getView(final int position, View convertView, ViewGroup parent) { 



      View row = convertView; 

      if (row == null) { 

       holder = new ViewHolder(); 

       LayoutInflater vi = (LayoutInflater)  
         mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row = vi.inflate(R.layout.junktabcomponent, null); 

       holder = new ViewHolder(); 
        holder.imgItem = (ImageView)row.findViewById(R.id.imgItem); 
        holder.imgDel = (ImageView)row.findViewById(R.id.imgDelete); 
        holder.imgInfo = (ImageView)row.findViewById(R.id.imgInfo); 
        holder. edQty = (EditText)row.findViewById(R.id.edQty); 
        holder.tvAmt = (TextView)row.findViewById(R.id.tvAmt); 
        holder.tvTotAmt = (TextView)row.findViewById(R.id.tvTotalAmt); 
        holder.viewDivider = (View)row.findViewById(R.id.view1); 


        row.setTag(holder); 
       // holder.edQty.setTag(itemList.get(position).getId()); 


      } else { 

       holder = (ViewHolder) row.getTag(); 

      } 


     /* LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Service.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.junktabcomponent,null, false); 
      holder = new ViewHolder(); 
      holder.imgItem = (ImageView)row.findViewById(R.id.imgItem); 
      holder.imgDel = (ImageView)row.findViewById(R.id.imgDelete); 
      holder.imgInfo = (ImageView)row.findViewById(R.id.imgInfo); 
      holder. edQty = (EditText)row.findViewById(R.id.edQty); 
      holder.tvAmt = (TextView)row.findViewById(R.id.tvAmt); 
      holder.tvTotAmt = (TextView)row.findViewById(R.id.tvTotalAmt); 
      holder.viewDivider = (View)row.findViewById(R.id.view1); */ 

     // holder.edQty.setText(qty); 


      holder.edQty.setInputType(InputType.TYPE_CLASS_NUMBER); 


       final JunkTabBean item = (JunkTabBean) itemList.get(position); 


       img.DisplayImage(item.getImage(), holder.imgItem); 
       holder.edQty.setHint(item.getUnits()); 

      // final int pos=(Integer) holder.edQty.getTag(); 

       if(map.containsKey(holder.reference)) 
       { 
        holder.edQty.setText(map.get(holder.reference).toString()); 
       } 
       holder.edQty.addTextChangedListener(new TextWatcher() 

       { 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
        /*value=value+s; 
        Log.e("value",value);*/ 


       } 

       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        //map.put(pos,s.toString()); 

        map.put(holder.reference,s.toString()); 

        Log.e("map",""+map); 
        //holder.tvAmt.setText(""+(Integer.parseInt(item.getPrize()) * Integer.parseInt(map.get(holder.reference)))); 
        //holder.tvAmt.setText(""+(Integer.parseInt(item.getPrize()) * Integer.parseInt(s.toString()))); 
        /*totAmt=totAmt+(Integer.parseInt(item.getPrize()) * Integer.parseInt(s.toString())); 
        junkTab.setTotAmt(""+totAmt);*/ 
        //qty=s.toString(); 

       } 
      }); 

       holder.reference=position; 
      // holder.edQty.setText(map.get(position)); 

       // if(!map.get(position).contains("")) 

       /* if(!holder.edQty.getText().toString().equalsIgnoreCase("")) 
       holder.tvAmt.setText(""+(Integer.parseInt(item.getPrize())* Integer.parseInt(holder.edQty.getText().toString())));*/ 

      return row; 

    } 



} 
+0

ListView的項目被重新上滾動。你需要保存值來填充editText onScrolling。否則上述問題將一直存在。 – Tauqir

+0

@ tauqir-我怎麼能達到相同的? Plz幫我編號爲 –

回答

0

你的適配器有保存的文本爲每EditText上:

  1. 建立一個地圖來保存值
  2. 定義和設置每個EditText的通用TextWatcher在editText上設置一個Tag(使用它的位置或給出你想要的任何id),你將使用這個標籤作爲hashMap中的關鍵字
  3. 創建一個方法來檢索給定EditText的值並將HashMap值保存在緩存或sharedPreferences中。
  4. 檢查editText的位置,並通過從存儲的緩存/ sharedPreferences中檢索值來相應地填充值。

按照Get all EditText values只提示。

+0

,可以說我有編輯文本的動態(未定義)編號,我如何爲每個編輯文本設置通用TextWatcher? – yfsx

2

這些類型的ListView問題的通用解決方案是視圖持有者模式。它對績效也有一個小的積極影響。

基本上這個想法是創建一個代表一個Listview項目的UI的類。它存儲視圖實例(EditTexts和whatnot)及其內容不變。當視圖列表中的適配器的getView()首次訪問,然後存儲爲查看對象的標籤創建

private class MyViewHolder { 
    public EditText myEditText; 
    public ViewGroup myListItemLayout; 
} 

觀Holder對象。

public View getView(int position, View convertView, ViewGroup parent) { 

    MyViewHolder holder = new ViewHolder(); 

    // Get the data object for this row. 
    MyDataItem item = items.get(position); 

    // If we receive a null View we need to construct a one. 
    if (convertView == null) { 
    convertView = inflater.inflate(R.layout.my_list_item, parent, false); 

    // Store the UI elements in the View Holder. 
    holder.myEditText = (EditText)view.findViewById(R.id.editTextMyEditText); 
    holder.myListItemLayout = (ViewGroup)view.findViewById(R.id.layoutMyListItemLayout); 

    // Strore the View Holder as the View's tag. 
    convertView.setTag(holder); 
    } 

    // Get the holder from the View's tag. 
    holder = (ViewHolder) convertView.getTag(); 

    ... 
} 

現在,當相同觀點的是後來在getView()再次訪問和convertView != null我們將跳過所有findViewById()代碼,並直接進入:

holder = (ViewHolder) convertView.getTag(); 

現在,查看是否具有正確的內容,而不是其他一些列出項目的數據。

至於getView()代碼的其餘部分,您只需將所有對View convertView的引用替換爲對View Holder的引用即而不是convertView.myTextView.setText("Hello world!")您將使用holder.myTextView.setText("Hello world!")

一些參考:
https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder
http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html
https://dzone.com/articles/optimizing-your-listview
http://www.vogella.com/tutorials/AndroidListView/article.html#adapterperformance_holder

相關問題