Android listview中的Getview更新listview中的所有项

Android listview中的Getview更新listview中的所有项,android,listview,Android,Listview,我有一个listview,其中有一些textview和一个editText。我想要的是,当editText中的文本发生更改时,它应该更新listview中相应的textview。但问题是它正在更新listview中的所有listItems。我的getview代码如下所示: import java.util.ArrayList; import android.content.Context; import android.text.Editable; import android.text.Tex

我有一个listview,其中有一些textview和一个editText。我想要的是,当editText中的文本发生更改时,它应该更新listview中相应的textview。但问题是它正在更新listview中的所有listItems。我的getview代码如下所示:

import java.util.ArrayList;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter {
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<LItem> lstItems;
    TextView tvAQuantity , tvBQuantity;
    EditText etQuantity;
    LItem p;
    ViewHolder holder;

    ListAdapter(Context context, ArrayList<LItem> objects) {
        ctx = context;
        lstItems = objects;
        lInflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return lstItems.size();
    }

    @Override
    public Object getItem(int position) {
        return lstItems.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;

        if (view == null) {
            view = lInflater.inflate(R.layout.list_style_task
                    , parent, false);


            holder = new ViewHolder();

            holder.tvAQuan = (TextView) view.findViewById(R.id.tvAQuantity);
            holder.tvBQuan=(TextView)view.findViewById(R.id.tvBQuantity);
            holder.etQuan=(EditText)view.findViewById(R.id.etTaskQuantity);

            holder.tvMatN= (TextView) view.findViewById(R.id.tvMaterial )   ;
            holder.tvTksN= (TextView) view.findViewById(R.id.tvTask )   ;
            view.setTag(holder);

        //  tvAQuantity.setText(p.getAQ());
       //   etQuantity.setTag(position);

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

            }
        p = getProduct(position);
  if(p!=null)
  {
      if(holder.tvAQuan!=null)
    {


      holder.tvAQuan.setText(p.getAQ());
      holder.tvBQuan.setText(p.getBQ());
      holder.tvMatN.setText(p.getMName());
      holder.tvTksN.setText(p.getTName());
        holder. etQuan.setTag(position);
      holder.etQuan.setOnFocusChangeListener(new View.OnFocusChangeListener() {
          @Override
          public void onFocusChange(View v, boolean hasFocus) {
              if (!hasFocus) {
                  p.setAQ( holder.etQuan.getText().toString());
                  notifyDataSetChanged();


              }
          }
      });



    }
  }

    //  CheckBox cbBuy = (CheckBox) view.findViewById(R.id.checkbox);
        //cbBuy.setOnCheckedChangeListener(myCheckChangList);
    //  cbBuy.setTag(position);
    //  cbBuy.setChecked(p.selected);
        return view;
    }

    LItem getProduct(int position)
    {
        return ((LItem) getItem(position));
    }

    ArrayList<LItem> getBox() {
        ArrayList<LItem> box = new ArrayList<LItem>();
        for (LItem p : lstItems) {
        //  if (p.selected)
            //  box.add(p);
        }
        return box;
    }

    OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            //getProduct((Integer) buttonView.getTag())= isChecked;
        }
    };


    public static class ViewHolder{

        public TextView tvAQuan;
        public TextView tvBQuan;
        public EditText etQuan;
        public TextView tvMatN;
        public TextView tvTksN;

    }

}
LinearLayout rl = (LinearLayout)v.getParent();
import java.util.ArrayList;
导入android.content.Context;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.CheckBox;
导入android.widget.CompoundButton;
导入android.widget.CompoundButton.OnCheckedChangeListener;
导入android.widget.EditText;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类ListAdapter扩展了BaseAdapter{
上下文ctx;
拉平机;
数组列表项;
文本视图tvAQuantity、tvBQuantity;
编辑文本数量;
LItem p;
视窗座;
ListAdapter(上下文、ArrayList对象){
ctx=上下文;
项目=对象;
lInflater=(LayoutInflater)ctx
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
public int getCount(){
返回lstItems.size();
}
@凌驾
公共对象getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
视图=充气机。充气(R.layout.list\u style\u任务
,家长,假);
holder=新的ViewHolder();
holder.tvAQuan=(TextView)view.findViewById(R.id.tvAQuantity);
holder.tvBQuan=(TextView)view.findViewById(R.id.tvBQuantity);
holder.etQuan=(EditText)view.findViewById(R.id.etTaskQuantity);
holder.tvMatN=(TextView)view.findViewById(R.id.tVMatary);
holder.tvTksN=(TextView)view.findViewById(R.id.tvTask);
视图.设置标签(支架);
//tvAQuantity.setText(p.getAQ());
//etQuantity.setTag(位置);
}
否则{
holder=(ViewHolder)view.getTag();
}
p=getProduct(位置);
如果(p!=null)
{
if(holder.tvAQuan!=null)
{
holder.tvAQuan.setText(p.getAQ());
holder.tvBQuan.setText(p.getBQ());
holder.tvMatN.setText(p.getMName());
holder.tvTksN.setText(p.getTName());
持有者.etQuan.setTag(位置);
holder.etQuan.setOnFocusChangeListener(新视图.OnFocusChangeListener(){
@凌驾
public void onFocusChange(视图v,布尔hasFocus){
如果(!hasFocus){
p、 setAQ(holder.etQuan.getText().toString());
notifyDataSetChanged();
}
}
});
}
}
//复选框cbBuy=(复选框)view.findViewById(R.id.CheckBox);
//cbBuy.setOnCheckedChangeListener(我的检查列表);
//cbBuy.setTag(位置);
//cbBuy.setChecked(p.selected);
返回视图;
}
LItem getProduct(内部位置)
{
返回((LItem)getItem(position));
}
ArrayList getBox(){
ArrayList box=新的ArrayList();
对于(LItem p:lstItems){
//如果(p.selected)
//框。添加(p);
}
返回框;
}
OnCheckedChangeListener myCheckChangList=新建OnCheckedChangeListener(){
检查更改后的公共无效(复合按钮视图,
布尔值(已检查){
//getProduct((整数)buttonView.getTag())=isChecked;
}
};
公共静态类视图持有者{
公共文本视图tvAQuan;
公共文本视图tvBQuan;
公共编辑权;
公共文本视图tvmat;
公共文本视图tvTksN;
}
}

问题在于处理getView方法错误。这里我将添加一个示例代码

步骤1

您需要这样的viewHolder类。在此处添加膨胀的xml小部件:

/********* Create a holder Class to contain inflated xml file elements *********/
         public static class ViewHolder{

             public TextView text;
             public TextView text1;
             public TextView textWide;
             public ImageView image;

         }
步骤2

在getView方法中

/****** Depends upon data size called for each row , Create each ListView row *****/


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

                 View vi = convertView;
                 ViewHolder holder;

                 if(convertView==null){

                     /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
                     vi = inflater.inflate(R.layout.tabitem, null);

                     /****** View Holder Object to contain tabitem.xml file elements ******/

                     holder = new ViewHolder();
                     holder.text = (TextView) vi.findViewById(R.id.text);
                     holder.text1=(TextView)vi.findViewById(R.id.text1);
                     holder.image=(ImageView)vi.findViewById(R.id.image);

                    /************  Set holder with LayoutInflater ************/
                     vi.setTag( holder );
                 }
                 else 
                     holder=(ViewHolder)vi.getTag();
     return vi;
    }
这是一个可以询问任何疑问的示例

编辑1:

在您的情况下,像这样更改getView

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
ViewHolder holder;
        if (view == null) {
holder = new ViewHolder();
            view = lInflater.inflate(R.layout.list_style_task
                    , parent, false);
holder .tvAQuantity=((TextView) view.findViewById(R.id.tvAQuantity ))  ;
holder .tvMaterial = (TextView) view.findViewById(R.id.tvMaterial );
holder.tvTask = (TextView) view.findViewById(R.id.tvTask );
holder . tvBQuantity=((TextView) view.findViewById(R.id.tvBQuantity ));
holder. etQuantity=(EditText)view.findViewById(R.id.etTaskQuantity);
view.setTag(holder);
    }else{
holder = (ViewHolder) view.getTag();
}

          p = getProduct(position);



        holder .tvMaterial.setText(p.getMName() ;
        holder.tvTask.setText(p.getTName() );

          holder.tvBQuantity.setText(p.getBQ());

        holder.tvAQuantity.setText(p.getAQ());
        holder.etQuantity.setTag(position);


        return view;
    }
并创建一个ViewHolder类

public static class ViewHolder{

             public TextView tvAQuantity, tvTask;
             public TextView tvMaterial;
             public TextView textWide;
             public EditText etQuantity;


         }
注意:

我认为你不需要下面这句话

holder.etQuantity.setTag(position);
只需评论这句话,然后再试一次

这是一个示例,询问是否需要帮助

编辑2:

我发现了问题。每当焦点第一次更改和默认值时,都会调用setOnFocusChangeListener。因此,在编辑文本中输入任何内容后,所有项目都会自动更新。因此,您需要使用其他方法,如TExtChanged Listener


另一个问题是,您正在从p获取数据,这意味着getProduct。然后再次将值设置为getProduct。这样做的目的是什么?。我认为您需要在这里更改逻辑。

在您的持有者中定义的EditText在哪里,首先将视图持有者中定义的变量etQuan的声明更改为EditText,而不是textview

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;



    if (view == null) {
        view = lInflater.inflate(R.layout.list_style_task
                , parent, false);


        holder = new ViewHolder();

        holder.tvAQuan = (TextView) view.findViewById(R.id.tvAQuantity);
        holder.tvBQuan=(TextView)view.findViewById(R.id.tvBQuantity);

        holder.tvMatN= (TextView) view.findViewById(R.id.tvMaterial )   ;
        holder.tvTksN= (TextView) view.findViewById(R.id.tvTask )   ;
        view.setTag(holder);

    //  tvAQuantity.setText(p.getAQ());
   //   etQuantity.setTag(position);

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

        }

      // edited here
    EditText etQuan=(EditText)view.findViewById(R.id.etTaskQuantity);
    etQuan.setTag(position);
    etQuan.setOnClickListener(ctx);



    p = getProduct(position);
 if(p!=null)
  {
   if(holder.tvAQuan!=null)
  {


  holder.tvAQuan.setText(p.getAQ());
  holder.tvBQuan.setText(p.getBQ());
  holder.tvMatN.setText(p.getMName());
  holder.tvTksN.setText(p.getTName());
    holder. etQuan.setTag(position);
  holder.etQuan.setOnFocusChangeListener(new View.OnFocusChangeListener() {
      @Override
      public void onFocusChange(View v, boolean hasFocus) {
          if (!hasFocus) {
              p.setAQ( holder.etQuan.getText().toString());
              notifyDataSetChanged();


          }
      }
  });



}
}

//  CheckBox cbBuy = (CheckBox) view.findViewById(R.id.checkbox);
    //cbBuy.setOnCheckedChangeListener(myCheckChangList);
//  cbBuy.setTag(position);
//  cbBuy.setChecked(p.selected);
    return view;
}
然后在使用此自定义适配器的活动上执行此操作

    public class Activityname extends ListActivity implements
    android.view.View.OnClickListener {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.yourviewname);
    //rest code of your activity
 }

 @Override
public void onClick(View v) {


    if (v.getId() == R.id.etTaskQuantity) {

        EditText edttxt = (EditText) v;
        LItem obj = (LItem) ListAdapter.getItem((Integer) edttxt
                .getTag());

      // with edttxt do what need to add




    }

解决了,需要先获得视图的父布局,如下所示:

import java.util.ArrayList;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter {
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<LItem> lstItems;
    TextView tvAQuantity , tvBQuantity;
    EditText etQuantity;
    LItem p;
    ViewHolder holder;

    ListAdapter(Context context, ArrayList<LItem> objects) {
        ctx = context;
        lstItems = objects;
        lInflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return lstItems.size();
    }

    @Override
    public Object getItem(int position) {
        return lstItems.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;

        if (view == null) {
            view = lInflater.inflate(R.layout.list_style_task
                    , parent, false);


            holder = new ViewHolder();

            holder.tvAQuan = (TextView) view.findViewById(R.id.tvAQuantity);
            holder.tvBQuan=(TextView)view.findViewById(R.id.tvBQuantity);
            holder.etQuan=(EditText)view.findViewById(R.id.etTaskQuantity);

            holder.tvMatN= (TextView) view.findViewById(R.id.tvMaterial )   ;
            holder.tvTksN= (TextView) view.findViewById(R.id.tvTask )   ;
            view.setTag(holder);

        //  tvAQuantity.setText(p.getAQ());
       //   etQuantity.setTag(position);

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

            }
        p = getProduct(position);
  if(p!=null)
  {
      if(holder.tvAQuan!=null)
    {


      holder.tvAQuan.setText(p.getAQ());
      holder.tvBQuan.setText(p.getBQ());
      holder.tvMatN.setText(p.getMName());
      holder.tvTksN.setText(p.getTName());
        holder. etQuan.setTag(position);
      holder.etQuan.setOnFocusChangeListener(new View.OnFocusChangeListener() {
          @Override
          public void onFocusChange(View v, boolean hasFocus) {
              if (!hasFocus) {
                  p.setAQ( holder.etQuan.getText().toString());
                  notifyDataSetChanged();


              }
          }
      });



    }
  }

    //  CheckBox cbBuy = (CheckBox) view.findViewById(R.id.checkbox);
        //cbBuy.setOnCheckedChangeListener(myCheckChangList);
    //  cbBuy.setTag(position);
    //  cbBuy.setChecked(p.selected);
        return view;
    }

    LItem getProduct(int position)
    {
        return ((LItem) getItem(position));
    }

    ArrayList<LItem> getBox() {
        ArrayList<LItem> box = new ArrayList<LItem>();
        for (LItem p : lstItems) {
        //  if (p.selected)
            //  box.add(p);
        }
        return box;
    }

    OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            //getProduct((Integer) buttonView.getTag())= isChecked;
        }
    };


    public static class ViewHolder{

        public TextView tvAQuan;
        public TextView tvBQuan;
        public EditText etQuan;
        public TextView tvMatN;
        public TextView tvTksN;

    }

}
LinearLayout rl = (LinearLayout)v.getParent();
我已经修改了代码,因为我使用了按钮点击,而不是编辑文本的焦点改变

 final int     posi=position;

            holder.btnRefreshQuantity.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    LinearLayout rl = (LinearLayout)v.getParent();

                    holder.tvAQuan = (TextView) rl .findViewById(R.id.tvAQuantity);
                    holder.etQuan=(EditText)rl.findViewById(R.id.etTaskQuantity);
                    p = getProduct(posi);
                    p.setAQ(  holder.etQuan.getText().toString() );
                    String s=  holder.etQuan.getText().toString();
                   // Log.d("etQuanText", holder.etQuan.getText().toString());
                   // Log.d("aq",Integer.toString(posi));
                    notifyDataSetChanged();
                }
            });

这是一个列表视图优化,但我想要的是在getview中分配值和处理单个视图事件。我理解这一点。getView中出现错误的原因是错误的。也就是说,分配视图的方式是错误的。使用支架。您的问题将得到解决。您是否可以显示代码的示例代码,因为您没有像代码中那样为视图赋值,也没有在视图上调用事件。我尝试了方法b