0

即时通讯尝试保存在ListView中的Edittext的值,它的工作原理,但是当ListView过大,当我编辑1编辑文本,如果我滚动列表视图,另一个EditText正在编辑同时......我不知道该怎么做,我浪费了6小时,什么都没有。如果有人能帮助我,请。如何使用edittexts在自定义ListView中实现监听器文本更改?

这是自定义列表视图

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final int position2 = position; 
     View v = convertView; 
     final ViewHolder holder; 

     if(v == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.lista_item_prepedido, null); 

      holder = new ViewHolder(); 

      holder.codi = (TextView) v.findViewById(R.id.NomProducte); 
      holder.nom = (EditText) v.findViewById(R.id.Preu); 
      holder.eliminar = (ImageButton) v.findViewById(R.id.delete); 
      View eliminarPrepedido = (ImageButton) v.findViewById(R.id.delete); 

      if(blocClients.equals("0")) 
      { 
       eliminarPrepedido.setVisibility(View.GONE); 
       holder.nom.setFocusable(false); 
      } 


      v.setTag(holder); 

      holder.nom.setText(items.get(position).getNom()); 
      holder.nom.addTextChangedListener(new TextWatcher(){ 

       @Override 
       public void afterTextChanged(Editable s) { 


       } 

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

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, 
         int before, int count) { 



        items.get(position2).Nom = s.toString(); 



        String preu = items.get(position2).Nom; 
        String nomproducte = items.get(position2).Codic; 
        int position = position2; 

        //mostrarMensaje("Valor: "+preu+" Nom Producte: "+nomproducte+" CodiClient: " +CodicClient+ " posicio: "+position); 
        baseDatos = openOrCreateDatabase(nombreBD, MODE_WORLD_WRITEABLE, null); 

        String sqlStr = "UPDATE estadistiques SET ultimpreu = '" +preu+"' WHERE codic_client='"+CodicClient+"' AND desc_article = '"+nomproducte+"' "; 
        baseDatos.execSQL(sqlStr); 

        try { 
         fnGlobal.CreaSincroFitxer(sqlStr); 
        } catch (FileNotFoundException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 

        baseDatos.close(); 
       } 


      }); 


     } else { 
      holder = (ViewHolder) v.getTag(); 

     } 


     holder.codi.setText(items.get(position).getCodic()); 


     holder.eliminar.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 

       final int position = position2; 
       String CodicClient = null; 
       Bundle extras = getIntent().getExtras(); 
       CodicClient = extras.getString("codiClientTab"); 
       String nomproducte = items.get(position).Codic; 
       int Opcio = 1; 


       baseDatos = openOrCreateDatabase(nombreBD, MODE_WORLD_WRITEABLE, null); 
       String sqlStr = "DELETE FROM estadistiques WHERE codic_client ='"+CodicClient+"' AND desc_article ='"+nomproducte+"'" ; 
       baseDatos.execSQL(sqlStr); 

       try { 
        fnGlobal.CreaSincroFitxer(sqlStr); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       baseDatos.close(); 

       notifyDataSetChanged(); 

       onResume(); 

      } 

     }); 





     return v; 
    } 
} 
的getView的代码

的列表视图

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/item" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:background="@drawable/rounded_rectangle" 
    android:orientation="horizontal" 
    android:padding="6dip" > 

    <ImageButton 
     android:id="@+id/delete" 
     android:layout_width="30dp" 
     android:layout_height="30dp" 
     android:layout_marginRight="6dp" 
     android:layout_marginTop="15dp" 
     android:background="@drawable/delete" /> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <EditText 
      android:id="@+id/Preu" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_alignLeft="@+id/NomProducte" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      android:layout_marginRight="5dp" 
      android:background="@color/white" 
      android:ellipsize="end" 
      android:gravity="right" 
      android:inputType="numberDecimal" 
      android:singleLine="true" 
      android:text="nom" 
      android:textSize="18sp" /> 

     <TextView 
      android:id="@+id/NomProducte" 
      android:layout_width="150dp" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@+id/Preu" 
      android:layout_alignParentLeft="true" 
      android:layout_marginLeft="5dp" 
      android:layout_weight="0.16" 
      android:clickable="false" 
      android:ellipsize="end" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:singleLine="true" 
      android:text="codi" 
      android:textColor="#000000" 
      android:textSize="18sp" /> 

    </RelativeLayout> 

</LinearLayout> 
自定义XML项目

非常感谢! :)

+0

您可以添加R.layout.lista_item_prepedido中的代码,以便清楚自定义ListView中的内容 - 它可以帮助人们回答。 – 2013-03-14 11:56:30

+0

更新了R.layout.item_item_prepedido – Ezrou 2013-03-15 08:21:32

回答

0

如果我已经理解了你的问题,那么使它总是以一种容易理解的方式行事将是非常困难的。我建议你改变你实现这个的方式,让ListView中的两个TextView显示两条信息。当点击可编辑的对象时,调出一个对话框来编辑信息,然后在移动列表视图之前,用户必须接受或取消信息,从而明确发生了什么。总之,我建议:

  • NomProducte成为一个像现在一样设置的TextView。
  • 捕获NomProducte的onTouch,弹出一个对话框,显示图像,Preu文本为TextView,NomProducte文本为EditText。
  • 用户将数据输入到该数据中。
  • 确定 - >接受新的文字动作
  • 取消 - >忽略新的文字动作。
+0

好主意谢谢! – Ezrou 2013-03-20 10:59:32

+0

谢谢,欣赏反馈。 – 2013-03-20 11:22:43