编辑文字内容丢失在列表视图上滚动 [英] Edit text loses content in list view on scrolling

查看:179
本文介绍了编辑文字内容丢失在列表视图上滚动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在列表视图中的多个编辑文本。编辑文本的数量是不固定的。当列表视图滚动编辑文字失去了它的内容,或者在焦点显示了一些其他的编辑文本的价值其他一些编辑文本。我曾尝试提供对堆栈溢出解决方案,但没有什么帮助了。

我已经声明了一个哈希表中,我存储的地位和价值,然后设置在编辑文本的文本从哈希地图,地方哈希地图覆盖在previously存储位置值。

如果需要code请让我知道。我将更新我的code我的问题。

更新我的问题与我的code,我曾尝试 -

 公共类JunkTabAdapter扩展ArrayAdapter< JunkTabBean> {    私人活动mContext;
    / * android.graphics.Typeface面。 * /
    私人诠释listItemForFile;
    私有静态的ArrayList< JunkTabBean> ITEMLIST =新的ArrayList< JunkTabBean>();    私人的ListView download_row;
    ImageLoader的ImageLoader的;
    长文件长度;
    字符串的getImage,saveinternalImagePath;
    位图getBitmapImage;
    HomeLoader HL;
    NewImageLoader IMG;
    串fromWhere;    字符串值=;
    串数量=;
    清单<整数GT; totAmtList =新的ArrayList<整数GT;();
    JunkTab junkTab;
    公众诠释totAmt = 0;    ViewHolder持有人;    地图<整数,字符串>地图=新的HashMap<整数,字符串>();
    诠释计数= 0;
    公共JunkTabAdapter(活动的背景下,INT listItemForFile,
            ArrayList的< JunkTabBean> ITEMLIST,字符串fromWhere,JunkTab junkTab){
        超(背景下,listItemForFile,ITEMLIST);
        this.mContext =背景;
        this.listItemForFile = listItemForFile;
        this.itemList = ITEMLIST;
        this.fromWhere = fromWhere;
        this.junkTab = junkTab;        IMG =新NewImageLoader(背景);
    }    公众诠释的getCount(){
        返回itemList.size();
    }    公共JunkTabBean的getItem(JunkTabBean位置){
        返回的位置;
    }    众长getItemId(INT位置){
        返回的位置;
    }    公共类ViewHolder {        公共ImageView的imgItem;
        公共ImageView的imgInfo;
        公共ImageView的imgDel;
        公众的EditText edQty;
        公众的TextView tvAmt;
        公众的TextView tvTotAmt;
        公共查看viewDivider;        INT参考;    }
    //创建由适配器引用的每个项目的新的ImageView
    公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){          查看排= convertView;          如果(行== NULL){                持有人=新ViewHolder();                LayoutInflater VI =(LayoutInflater)
                        mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                行= vi.inflate(R.layout.junktabcomponent,NULL);                持有人=新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);
                  持有人。 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 =(查看)row.findViewById(R.id.view1);
                  row.setTag(保持器);
                // holder.edQty.setTag(itemList.get(位置).getId());
            }其他{                支架=(ViewHolder)row.getTag();            }
         / * LayoutInflater吹气=(LayoutInflater)mContext.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
          行= inflater.inflate(R.layout.junktabcomponent,空,假);
          持有人=新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);
          持有人。 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 =(查看)row.findViewById(R.id.view1); * /         // holder.edQty.setText(数量);
          holder.edQty.setInputType(InputType.TYPE_CLASS_NUMBER);
              最后JunkTabBean项目=(JunkTabBean)itemList.get(位置);
              img.DisplayImage(item.getImage(),holder.imgItem);
              holder.edQty.setHint(item.getUnits());             //最终诠释POS =(整数)holder.edQty.getTag();              如果(map.containsKey(holder.reference))
              {
                  holder.edQty.setText(map.get(holder.reference)的ToString());
              }
              holder.edQty.addTextChangedListener(新TextWatcher()              {                @覆盖
                公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
                    / *值=价值+ S;
                    Log.e(值,值); * /
                }                @覆盖
                公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数后INT){
                    // TODO自动生成方法存根                }                @覆盖
                公共无效afterTextChanged(编辑S){
                    //map.put(POS,s.toString());                    map.put(holder.reference,s.toString());                    Log.e(图,+地图);
                    //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 =位置;
             // holder.edQty.setText(map.get(位置));              //如果(!map.get(位置)。载有())              / *如果(!holder.edQty.getText()。的toString()。equalsIgnoreCase())
              holder.tvAmt.setText(+(的Integer.parseInt(item.getPrize())*的Integer.parseInt(holder.edQty.getText()的toString()))); * /          返回行;    } }


解决方案

对于这类的ListView 问题的一个通用的解决方案是查看持有人格局。它也有对性能有一点积极的影响。

基本上的想法是创建一个类,它重新presents 1 ListView项的UI。它存储的使用其内容的完整视图实例(EditTexts和诸如此类的东西)。

 私有类MyViewHolder {
  公众的EditText myEditText;
  公众的ViewGroup myListItemLayout;
}

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

 公共查看getView(INT位置,查看convertView,父母的ViewGroup){  MyViewHolder持有人=新ViewHolder();  //获取此行的数据对象。
  MyDataItem项目= items.get(位置);  //如果我们收到一个空视图,我们需要构建一个。
  如果(convertView == NULL){
    convertView = inflater.inflate(R.layout.my_list_item,父母,假);    //存储在View持有人的UI元素。
    holder.myEditText =(EditText上)view.findViewById(R.id.editTextMyEditText);
    holder.myListItemLayout =(ViewGroup中)view.findViewById(R.id.layoutMyListItemLayout);    // Strore查看持有人作为视图的标签。
    convertView.setTag(保持器);
  }  //从查看的标签的持有人。
  支架=(ViewHolder)convertView.getTag();  ...
}

现在,当同样的观点是后来在再次访问getView() convertView!= NULL 我们将跳过所有的 findViewById() code和直接进入:

  =持有人(ViewHolder)convertView.getTag();

现在查看是否具有正确的内容,而不是其他一些列表项的数据。

对于getView()$ C $休息c您将只替换即代替来查看持有人引用视图convertView所有引用convertView.myTextView.setText(世界,你好!)你会使用 holder.myTextView.setText(世界,你好!)

一些参考文献:结果
https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder

HTTP://www.java$c$cgeeks .COM / 2013/09 / Android的viewholder图案,example.html的结果
https://dzone.com/articles/optimizing-your-listview 结果
http://www.vogella.com/tutorials/AndroidListView/article.html#adapterperformance_holder

I have multiple edit text in list view. Number of edit texts is not fixed. When list view is scrolled edit text loses its content or some other edit text that is in focus shows value of some other edit text. I have tried solutions provided on Stack Overflow but nothing is helping out.

I have declared a hash map in which I'm storing position and value and then setting text in edit text from hash map but somewhere hash map is overwriting values in previously stored positions.

If code is required kindly let me know. I will update my question with my code.

Updating my question with my code that I have 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;

    }



 }

解决方案

A generic solution for these kind of ListView problems is the View Holder pattern. It also has a small positive impact on performance.

Basically the idea is to create a class which represents the UI of one Listview item. It stores the View instances (EditTexts and whatnot) with their content intact.

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

The View Holder object is created when a View is accessed for the first time in the list adapter's getView() and is then stored as the View objects' tags.

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();

  ...
}

Now when the same View is later accessed again in getView() and convertView != null we will skip all the findViewById() code and go straight into:

holder = (ViewHolder) convertView.getTag();

Now the View has the correct content instead of some other list item's data.

As for rest of the getView() code you'll just replace all references to the View convertView with references to the View Holder i.e. instead of convertView.myTextView.setText("Hello world!") you'll use holder.myTextView.setText("Hello world!")

Some references:
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

这篇关于编辑文字内容丢失在列表视图上滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆