当前位置: 首页 > 知识库问答 >
问题:

将视图添加到ListView时出现Java . lang . illegalstateexception

卞俊哲
2023-03-14

我试图通过调用:来添加视图和删除视图,具体取决于我的需要从我的 ListView 适配器

 holder.wrapper.removeView(holder.PimageView);
 holder.wrapper.removeView(holder.theMessage);

 holder.wrapper.addView(holder.PimageView);

根据我的需要,当转换视图为空(第一次加载)它的工作原理找到,但当我刷新那个(转换视图不为空)我得到这个错误:

 07-05 14:00:36.077: E/AndroidRuntime(2019): FATAL EXCEPTION: main
 07-05 14:00:36.077: E/AndroidRuntime(2019): Process: com.lifemate.lmmessenger, PID:  
 2019
 07-05 14:00:36.077: E/AndroidRuntime(2019): java.lang.IllegalStateException: The  
 specified 
 child already has a parent. You must call removeView() on the child's parent first.
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.view.ViewGroup.addViewInner(ViewGroup.java:3562)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.view.ViewGroup.addView(ViewGroup.java:3415)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.view.ViewGroup.addView(ViewGroup.java:3360)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.view.ViewGroup.addView(ViewGroup.java:3336)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 com.lifemate.lmmessenger.listviewengine.ChatAdapter.getView(ChatAdapter.java:249)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.widget.AbsListView.obtainView(AbsListView.java:2240)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.widget.ListView.makeAndAddView(ListView.java:1790)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.widget.ListView.fillUp(ListView.java:725)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.widget.ListView.layoutChildren(ListView.java:1611)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.widget.AbsListView.onLayout(AbsListView.java:2091)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.view.View.layout(View.java:14817)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at 
 android.view.ViewGroup.layout(ViewGroup.java:4631)
 07-05 14:00:36.077: E/AndroidRuntime(2019):    at  
 android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)

顺便说一句,最后一行是RelativeLayout。onLayout,但如果我的xml是带有LinearLayout子级的FrameLayout的话,这正常吗?

这是我的代码:

  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
   if (convertView == null) {
        holder = new ViewHolder();
        convertView = mLayoutInflater.inflate(R.layout.listitem_discuss, null);
        this.convertview=convertView;



    System.out.println("ConverView null");

    holder.PimageView = (ImageView)convertView.findViewById(R.id.PimageView);
    holder.wrapper = (LinearLayout) convertView.findViewById(R.id.wrapper);
    holder.theMessage = (TextView) convertView.findViewById(R.id.comment);
    holder.theName = (TextView) convertView.findViewById(R.id.MSGname);
    holder.theImage = (ImageView)convertView.findViewById(R.id.MSGimage);
    holder.lp = (FrameLayout.LayoutParams) holder.theName.getLayoutParams();

 holder.paramsleft = new  FrameLayout.LayoutParams(
 LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,Gravity.LEFT);

 holder.paramsright = new FrameLayout.LayoutParams(
 LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,Gravity.RIGHT);


    convertView.setTag(holder);

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

   String theType="Known";

if(holder.badge!=null){
    holder.badge.setVisibility(View.GONE);
    holder.badge.invalidate();
    holder.badge=null;
 }

    mCursor.moveToPosition(position);   
    String imagenamer= 
 (mCursor.getString(mCursor.getColumnIndex("username")).split("\\@"))[0];
    int isright= Integer.valueOf(mCursor.getString(mCursor.getColumnIndex("isright")));
    holder.wrapper.removeView(holder.PimageView);
    holder.wrapper.removeView(holder.theMessage);
    // here both DependantViews are removed

  //Condition 1 :

  holder.wrapper.addView(holder.PimageView);

  //Condition 2 : 

  holder.wrapper.addView(holder.theMessage);

这些方法就是错误发生的地方,我尝试过View。GONE和View。VISIBLE,但在滚动列表视图之后,它会变得混乱,当它应该消失时,保留给PImageView的布局空间为空,比如当您调用View,INVISIBLE时。

这是我的XML:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >

<FrameLayout 
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
>

  <TextView
      android:id="@+id/MSGname"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="TextView"
       />

  <ImageView
      android:id="@+id/MSGimage"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="right"

      />

<LinearLayout
    android:id="@+id/wrapper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/PimageView"
        android:layout_width="1dp"
        android:layout_height="1dp"
        android:layout_margin="5dip"
        />



    <TextView
        android:id="@+id/comment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dip"
        android:background="@drawable/bubble_yellow"
        android:textColor="@android:color/primary_text_light" />

</LinearLayout>

</FrameLayout>

</LinearLayout>

持有者:

   if (convertView == null) {
        holder = new ViewHolder();
        convertView = mLayoutInflater.inflate(R.layout.listitem_discuss, null);
        this.convertview=convertView;



    System.out.println("ConverView null");

    holder.PimageView = (ImageView)convertView.findViewById(R.id.PimageView);
    holder.wrapper = (LinearLayout) convertView.findViewById(R.id.wrapper);
    holder.theMessage = (TextView) convertView.findViewById(R.id.comment);
    holder.theName = (TextView) convertView.findViewById(R.id.MSGname);
    holder.theImage = (ImageView)convertView.findViewById(R.id.MSGimage);
    holder.lp = (FrameLayout.LayoutParams) holder.theName.getLayoutParams();
    holder.paramsleft = new FrameLayout.LayoutParams
   (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,Gravity.LEFT);
    holder.paramsright = new FrameLayout.LayoutParams
  (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,Gravity.RIGHT);


    convertView.setTag(holder);

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

以及取景框:

  public static class ViewHolder {

    private TextView theMessage;

    private TextView theName;

    private LinearLayout wrapper;       

    private ImageView PimageView;

    ImageView theImage;

    ImageView theImage2;

    FrameLayout.LayoutParams lp;

    FrameLayout.LayoutParams paramsleft;

    FrameLayout.LayoutParams paramsright;

    BadgeView badge ;

    VideoView PvideoView;

  }

抱歉,如果它重复,但一些机构精确地问

任何帮助家伙出了什么问题?多谢

共有1个答案

郜琦
2023-03-14

您错误地实现了ViewHolder模式。由于您使用findViewById()获得的视图已经是LinearLayout的子视图,因此您根本不需要调用addView()

 类似资料:
  • 错误: 致命异常:main java。java上的lang.NullPointerException。木卫一。文件java上的fixSlashes(File.java:185) 。木卫一。文件(文件:java:134)在ua。罗曼波塔普斯基。安提霍克。普罗卡顿。交付活动。ua的galleryAddPic(DeliverActivity.java:308)。罗曼波塔普斯基。安提霍克。普罗卡顿。交付活

  • 问题内容: 最近8个小时我一直在阅读文档,但没有发现任何可以帮助我的东西。大概是,但是没有代码在工作,因为它一直说“找不到图像URL”并引发异常。但是我还有其他项目,从来没有这个问题。 因此,有一个类包含这样的月份: 到目前为止,一切都很好。我什至可以在控制台中对其进行测试,并且效果很好,并且可以按值排序。现在,当我尝试从资源中添加图像时,出现了我之前提到的问题:找不到URL。但是,我只能使用图像

  • 问题内容: 这是我第一次接触android。我正在尝试向我的ListView添加项目。我使用“选项卡”,查看添加项目的唯一方法是更改​​选项卡,然后返回到第一个选项卡。 我到处搜寻,而且一直都找到 但对我不起作用。 正如我所说,我已经使用固定标签+滑动创建了项目。我只希望有一个列表视图,哪些行具有一个EditText,一个Spinner和一个Button。在用于选项卡的Fragment的底部,我有

  • 我试图获得卡的列表,并尝试使用小部件,但有错误 我的代码: 我得到的错误是:

  • 若要添加一个新的视图,点击工具栏的 “视图”按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的视图,简单地从模型选项卡拖放视图到画布。 【注意】如果你按住 Control 键并点按视图的连接器,你可以选择添加或删除顶点,以及更改它的颜色。 在画布中视图对象的弹出式菜单选项包括: 选项 描述 设计视图 在“视图设计器”中编辑视图结构。 添加关联的对象 添加全部关联的表或视图到选择的

  • 若要添加一个新的视图,点击工具栏的 “视图”按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的视图,简单地从模型选项卡拖放视图到画布。 【注意】如果你右击视图连接器,你可以选择添加或删除顶点,以及更改它的颜色,或者前往源视图和目标表。 在画布中视图对象的弹出式菜单选项包括: 选项 描述 设计视图 在“视图设计器”中编辑视图结构。 添加关联的对象 添加全部关联的表或视图到选择的视图