2015-10-04 147 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

相关问题