【问题标题】:EditText inside ListView Crash onItemClick from row 11从第 11 行开始,ListView 中的 EditText 崩溃 onItemClick
【发布时间】:2014-04-28 04:40:22
【问题描述】:

我在 20 行的 ListView 中有一个 EditTextCheckboxEditText 对前 7 行隐藏,然后对所有其他行可见。 CheckBox 对前 7 行可见,然后对其他行隐藏。 onItemClick 我已经给了toast 以获取Edittext 的文本,它适用于开始10 行,但不适用于滚动时出现的最后一行。应用程序崩溃,给出NullPointerException 错误

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

       /************  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;
}

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


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

但是应用程序崩溃 onITemClick 方法...即使是 EditText 文本也会导致错误..

  public void onItemClick(int mPosition)
{


     View vListSortOrder;
     vListSortOrder=list.getChildAt(mPosition);     
     Log.d("valueeeeeeee", Integer.toString(mPosition));

     EditText edit=(EditText)vListSortOrder.findViewById(R.id.editText1);
   String temp=edit.getText().toString();
}


public void onClick(View arg0) { 
CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity; sct.onItemClick(mPosition); }

上面的 onItemClick 可以正常启动 10 行 .. 但在第 11 行它会在 EditText edit 行崩溃并出现空指针异常错误

日志猫

04-28 00:46:29.101: W/dalvikvm(2178): threadid=1: thread exiting with uncaught exception (group=0x41465700)
04-28 00:46:29.161: E/AndroidRuntime(2178): FATAL EXCEPTION: main
04-28 00:46:29.161: E/AndroidRuntime(2178): java.lang.NullPointerException
04-28 00:46:29.161: E/AndroidRuntime(2178):     at com.androidexample.customlistview.CustomListViewAndroidExample.onItemClick(CustomListViewAndroidExample.java:172)
04-28 00:46:29.161: E/AndroidRuntime(2178):     at com.androidexample.customlistview.CustomAdapter$OnItemClickListener.onClick(CustomAdapter.java:222)

完整的适配器代码

 @SuppressLint("NewApi") public class CustomAdapter extends BaseAdapter   implements OnClickListener {

/*********** Declare Used Variables *********/
 private Activity activity;
 private ArrayList data;
 private static LayoutInflater inflater=null;
 public Resources res;
 ListModel tempValues=null;
 int i=0;

int j=0;

public ArrayList<String> selectedStrings = new ArrayList<String>();


/*************  CustomAdapter Constructor *****************/
public CustomAdapter(Activity a, ArrayList d,Resources resLocal) {

    /********** Take passed values **********/
    activity = a;
    data=d;
    res = resLocal;

    /***********  Layout inflator to call external xml layout () **********************/
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

/******** What is the size of Passed Arraylist Size ************/
public int getCount() {

    if(data.size()<=0)
        return 1;
    return data.size();
}

public Object getItem(int position) {
    return data.get(position);
}

public long getItemId(int position) {
    return 0;
}

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

    public TextView text;
    public TextView text1;
    public EditText text2;
    public TextView textWide;
    public ImageView image;
    public CheckBox check;

}

/*********** Depends upon data size called for each row , Create each ListView row ***********/
public View getView(int position, View convertView, ViewGroup parent) {



    View vi=convertView;
    final 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.check.setOnClickListener(new OnClickListener(){

           @Override
             public void onClick(View v) 
             {
                 if (((CheckBox) v).isChecked()) 
                 {
                     holder.text2.setText("Checked");


                 }
                 else
                 {
                     holder.text2.setText("Not Checked");

                 }
             }
        });



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

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

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



    return vi;
}

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


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


@Override
public void onClick(View v) {
        Log.v("CustomAdapter", "=====Row button clicked");
}

/********* Called when Item click in ListView ************/
private class OnItemClickListener  implements OnClickListener{           
    private int mPosition;

    OnItemClickListener(int position){
         mPosition = position;
    }

    @Override
    public void onClick(View arg0) {
        CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity;
        sct.onItemClick(mPosition);
    }               
}   

}

04-28 03:33:23.542: E/AndroidRuntime(4917): FATAL EXCEPTION: main
04-28 03:33:23.542: E/AndroidRuntime(4917): java.lang.NullPointerException
04-28 03:33:23.542: E/AndroidRuntime(4917):     at com.androidexample.customlistview.CustomListViewAndroidExample$1.onClick(CustomListViewAndroidExample.java:89)
04-28 03:33:23.542: E/AndroidRuntime(4917):     at android.view.View.performClick(View.java:4240)
04-28 03:33:23.542: E/AndroidRuntime(4917):     at android.view.View$PerformClick.run(View.java:17721)
04-28 03:33:23.542: E/AndroidRuntime(4917):     at android.os.Handler.handleCallback(Handler.java:730)

【问题讨论】:

  • 请发布 logcat 错误
  • @shayanpourvatan 已更新
  • 请正确格式化您的代码。读起来很混乱。
  • 请阅读我的回答并尝试回答我在那里问你的问题,以便我可以帮助你。

标签: android android-fragments android-listview android-edittext android-checkbox


【解决方案1】:

您编写了令人困惑的代码。

你在 text2 上插入标签:

holder.text2.setTag(1);

然后下一行使用:

int position12 = (Integer)holder.text2.getTag();

所以每次position12 等于 1。

接下来是使用j而不是位置。

你也需要像下面的代码一样改变你的可见性,因为ListView's recycling

if(j<8){

     holder.text2.setVisibility(View.INVISIBLE);
     holder.check.setVisibility(View.VISIBLE);
     holder.check.setX(-150);

 }else{
     holder.text2.setVisibility(View.VISIBLE);
     holder.check.setVisibility(View.INVISIBLE);
  }

既然您有一个布局,为什么要覆盖 getViewTypeCountgetItemViewType

请从 getView 方法中删除以下行,

 holder.text2.getText();

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

您的问题

你的问题是:

private class OnItemClickListener  implements OnClickListener{           
    private int mPosition;

    OnItemClickListener(int position){
         mPosition = position;
    }

    @Override
    public void onClick(View arg0) {
        CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity;
        sct.onItemClick(mPosition);  <--- problem is here
    }               
}   

我不知道你到底想要什么,但你可以这样做。

1- 改变:

 vi.setOnClickListener(new OnItemClickListener(position));

 vi.setOnClickListener(this);

2- 在 getView 方法中添加以下行:

  holder.text.setTag(position);

3- 在 onClick 方法中添加如下代码:

@Override
public void onClick(View v) {
       TextView tv = (TextView)v.findViewById(R.id.textView1);
       int pos = (Integer)tv.getTag();
       Log.d("position of clicked item is", ""+pos);
}

4-改变

if(j<8)

if( position <8)

【讨论】:

  • 抱歉这个位置是错误的...没有在代码中使用...第 222 行是 public void onClick(View arg0) { CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity; sct.onItemClick(mPosition);
  • 您能否更新您的问题,因为评论很难阅读
  • 你为什么写CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity; sct.onItemClick(mPosition); }
  • 我用androidexample.com/…这个实现了EditText和CheckBox
  • 链接已损坏,请修复它,如果您看到我的答案并使用我的 if else 部分,则您不再需要 getViewTypeCountgetItemViewType
【解决方案2】:

1。在扩展 BaseAdapter 时,请始终记住重写这三个方法:

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

@Override
public YourObjectType getItem(int position) {

    return your_objects_list.get(position);
}

@Override
public long getItemId(int position) {
// you could return any id related to your context, i just return 0 because I don't need it

    return 0;
}

2. 摆脱这些方法:

你绝对不需要这些:


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


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

听着,让我解释一下你什么时候应该使用这些方法:

getViewTypeCount

此方法应返回您正在使用的不同 XML 布局文件的数量。例如,如果您对行使用 row_layout_1.xml 和 row_layout_2.xml 文件,则 getViewTypeCount() 应始终返回 2。

因此,如果您对所有行都使用单个 .XML 文件,则确实不应该覆盖此方法。

getItemViewType

当在单个列表项上调用此方法时,应返回类型。在我之前提到的示例中,它应该根据项目的位置返回 1 或 2。

由于您使用的是单个 XML 行类型,因此也不应覆盖此方法。

让我知道你的结果。

3. 不要使用j,而是使用position

移动此代码并将其放在 return vi 前一行;

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

    }

让我知道你的结果。

【讨论】:

  • BaseAdapter 需要此方法,ArrayAdapter 类不需要此方法
  • 不,你错了。绝对需要它,因为 ArrayAdapter 是 BaseAdapter 的扩展,他正在使用某种具有多种布局类型的动态列表。
  • 是的,如果你的类扩展 BaseAdapter 类,你需要这些方法,但如果你的类扩展 ArrayAdapter 类,那么构造函数处理的超级方法
  • 1.你怎么知道他在扩展 ArrayAdapter?! 2. 即使他是并且您的假设是正确的,他也应该覆盖 getcount 以正确处理多个布局。
  • 我使用 getViewTypeCount 和 getItemViewType bcz 视图在向下滚动列表视图时显示不正确...
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 2012-08-18
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多