【问题标题】:Edit text loses content in list view on scrolling滚动时编辑文本在列表视图中丢失内容
【发布时间】:2015-10-04 06:46:57
【问题描述】:

我在列表视图中有多个编辑文本。编辑文本的数量不固定。滚动列表视图时,编辑文本会丢失其内容或其他一些处于焦点的编辑文本会显示其他一些编辑文本的值。我已经尝试过 Stack Overflow 上提供的解决方案,但没有任何帮助。

我已经声明了一个哈希映射,我在其中存储位置和值,然后在哈希映射的编辑文本中设置文本,但是某个哈希映射覆盖了先前存储位置的值。

如果需要代码,请告诉我。我会用我的代码更新我的问题。

用我尝试过的代码更新我的问题-

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;

    }



 }

【问题讨论】:

  • ListView 项目在滚动时重新创建。您需要保存值以在 editText onScrolling 上填充它。否则上述问题将一直存在。
  • @tauqir- 我怎样才能做到这一点?请帮帮我

标签: android listview android-edittext


【解决方案1】:

这类ListView 问题的通用解决方案是View Holder 模式。它还对性能产生很小的积极影响。

基本上,这个想法是创建一个代表一个 Listview 项的 UI 的类。它以完整的内容存储视图实例(EditTexts 和诸如此类)。

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

View Holder 对象在第一次访问列表适配器的getView() 中的视图时创建,然后存储为视图对象的标签。

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

【讨论】:

    【解决方案2】:

    您的适配器必须为每个 EditText 保存文本:

    1. 创建地图以保存值
    2. 为每个 EditText 定义并设置一个通用的 TextWatcher
    3. 在editText上设置一个标签(使用它的位置或给你想要的任何id)你将使用这个标签作为hashMap中的键
    4. 创建一个方法来检索给定 EditText 的值并将 HashMap 值保存在缓存或 sharedPreferences 中。
    5. 检查 editText 的位置并通过从存储的缓存/sharedPreferences 中检索它来相应地填充值。

    请关注Get all EditText values,仅供参考。

    【讨论】:

    • 对于数字 2,假设我有动态(未定义)数量的编辑文本,我如何为每个编辑文本设置通用 TextWatcher?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2015-08-12
    • 2014-08-17
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多