【问题标题】:EditText/Checkbox inside ListViewListView 内的 EditText/Checkbox
【发布时间】:2014-04-27 02:06:06
【问题描述】:

我正在编写代码以在ListView 中插入EditTextcheckbox,在此CheckBox 将仅用于前7 行,然后EditText 将出现在每一行中。 以下代码适用于第一次查看。但是当我向下滚动 View...Checkbox 而不是 EditView 时。意味着EditText 得到隐藏,CheckBox 来了,我为此编写了下面的可见性代码。请你能帮助我哪里出错。

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.textView1);

        holder.check =(CheckBox)vi.findViewById(R.id.checkBox1);
         holder.text2=(EditText)vi.findViewById(R.id.editText1);
          holder.text2.setTag(1);
       int position12 = (Integer)holder.text2.getTag();
       System.out.print(position12 + "value");

       /************  Set holder with LayoutInflater ************/
        vi.setTag(holder);


        j++;

        if(j<8){
       holder.text2.setVisibility(View.INVISIBLE);
       holder.check.setX(-150);
        }else
        {
             holder.check.setVisibility(View.INVISIBLE);
        }



    }
    else  
        holder=(ViewHolder)vi.getTag();

    holder.text2.getText();
       if(data.size()<=0)
    {
        holder.text.setText("No Data");

        holder.text2.getText();
 //        Log.v("BBBB",  holder.text2.getText().toString());

    }
    else
    {
        /***** Get each Model object from Arraylist ********/
        tempValues=null;
        tempValues = (ListModel) data.get(position);

        /************  Set Model values in Holder elements ***********/
         holder.text.setText(tempValues.getCompanyName());

         holder.text2.getText();
                         /******** Set Item Click Listner for LayoutInflater for each row ***********/
         vi.setOnClickListener(new OnItemClickListener(position));
    }

    Log.v("DDD",  holder.text2.getText().toString());
    return vi;
}

【问题讨论】:

    标签: android android-layout listview android-listview android-edittext


    【解决方案1】:

    您必须在adapter 中明确定义元素的visibility。更改您的adapter 代码如下:

    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.textView1);
    
            holder.check =(CheckBox)vi.findViewById(R.id.checkBox1);
             holder.text2=(EditText)vi.findViewById(R.id.editText1);
              holder.text2.setTag(1);
           int position12 = (Integer)holder.text2.getTag();
           System.out.print(position12 + "value");
    
           /************  Set holder with LayoutInflater ************/
            vi.setTag(holder);
    
    
            j++;
    
            if(j<8){
                 holder.text2.setVisibility(View.INVISIBLE);
                 holder.check.setX(-150);
                 holder.check.setVisibility(View.VISIBLE);
            }else
            {
                 holder.check.setVisibility(View.INVISIBLE);
                 holder.text2.setVisibility(View.VISIBLE);
            }
    
    
    
        }
        else  
            holder=(ViewHolder)vi.getTag();
    
        holder.text2.getText();
           if(data.size()<=0)
        {
            holder.text.setText("No Data");
    
            holder.text2.getText();
     //        Log.v("BBBB",  holder.text2.getText().toString());
    
        }
        else
        {
            /***** Get each Model object from Arraylist ********/
            tempValues=null;
            tempValues = (ListModel) data.get(position);
    
            /************  Set Model values in Holder elements ***********/
             holder.text.setText(tempValues.getCompanyName());
    
             holder.text2.getText();
                             /******** Set Item Click Listner for LayoutInflater for each row ***********/
             vi.setOnClickListener(new OnItemClickListener(position));
        }
    
        Log.v("DDD",  holder.text2.getText().toString());
        return vi;
    }
    

    这可能会对你有所帮助。

    【讨论】:

      【解决方案2】:

      这是 ListView 行为,因为它是 recycles 视图。问题是ListView 正在为其他子项重用第一个可见项视图。

      您可以通过通知ListView 您有两种不同类型的视图来解决此问题。如果您查看 BaseAdapter getViewTypeCount() 方法返回计数为 1。

      因此您需要覆盖自定义适配器中的 getViewTypeCount() 并返回您有两个不同的视图。

      @Override
      public int getViewTypeCount() {
          return 2;
      }
      

      并且,getItemViewType() 默认返回 0。但是您的项目 &lt; 8 与其他项目不同,因此请告诉 ListView 您在位置

      @Override
      public int getItemViewType(int position) {
          if(position <8)
                  return 0;
              else
                  return 1;
      }
      

      编辑:

      如果您需要在ListView 中输入EditTextActivity 的清单中设置android:windowSoftInputMode="adjustPan"

      项目视图也应该是不同的视图类型,否则当你滚动时你会在EditText的其他列表项目中看到输入的文本。这是由于视图循环而发生的。

      您可以通过返回 getViewTypeCount 作为列表计数来解决此问题

       public int getViewTypeCount() {
              return getCount();
          }
      

      并更改 getItemViewType 以返回唯一 id ,例如,位置是唯一编号

       public int getItemViewType(int position) {
           return position;
       }
      

      【讨论】:

      • 这有很大帮助,但中间有一个复选框。实际上我总共有 20 行。getViewTypeCount() 应该是 2 吗?以及如何获取这些复选框/编辑文本的值/文本
      • getViewTypeCount 是不同类型视图的计数。在你的情况下,它 2
      • 谢谢!但问题是复选框之间有一个复选框,如果我向下滚动和向上滚动视图,它会发生变化。我如何使其保持不变
      • 问题可能是获取视图中的一些逻辑问题。再次检查您的代码。
      • 你能检查一下上面的代码吗.. 我没有收到错误.. 当我在向下滚动的 EditText 中写任何东西时,代码模拟器的行为如此出乎意料。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2013-10-13
      相关资源
      最近更新 更多