简体   繁体   English

当使用自定义arrayadapter在列表视图中单击edittext时,发生错误

[英]When onclick on the edittext in a listview using custom arrayadapter, Error occur

When I try to click the EditText in the ListView by following code, the apps stop and error occurred. 当我尝试通过以下代码单击ListView中的EditText时,应用程序停止并发生错误。

The custom arrayadapter is using to adding RelativeLayout into list view 自定义arrayadapter用于将RelativeLayout添加到列表视图中

RelativeLayoutListAdapter.java RelativeLayoutListAdapter.java

package com.example.justfortest;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RelativeLayout;

public class RelativeLayoutListAdapter extends ArrayAdapter<RelativeLayout> {

Context context;
List<RelativeLayout> layoutItemList;
int layoutResID;

public RelativeLayoutListAdapter(Context context, int layoutResourceID,
        List<RelativeLayout> listItems) {
    super(context, layoutResourceID, listItems);
    this.context = context;
    this.layoutItemList = listItems;
    this.layoutResID = layoutResourceID;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    LayoutItemHolder layoutHolder;
    View view = convertView;

    if (view == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        layoutHolder = new LayoutItemHolder();

        view = inflater.inflate(layoutResID, parent, false);
        layoutHolder.layoutcontect = (RelativeLayout) view.findViewById(R.id.layout_content);


        view.setTag(layoutHolder);

    } else {
        layoutHolder = (LayoutItemHolder) view.getTag();

    }

    RelativeLayout dItem = (RelativeLayout) this.layoutItemList.get(position);

    layoutHolder.layoutcontect.addView(dItem);  //This is Line 52

    return view;
}

private static class LayoutItemHolder {
    RelativeLayout layoutcontect;
}
}

here is the ActivityMain: 这是ActivityMain:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


            layoutlist = new ArrayList<RelativeLayout>();
        mDrawerList = (ListView) findViewById(R.id.container);

    layoutlist.add(CreatLayout());
    layoutlist.add(AddTakes());
    layoutlist.add(AddTakes());
    adapter = new RelativeLayoutListAdapter(this, R.layout.layout_container,layoutlist );

    mDrawerList.setAdapter(adapter);
    }

public RelativeLayout CreatLayout(){
    RelativeLayout layout = new RelativeLayout(this);
    /*--Adding TextViews, EditTexts, RadioButtons in RelativeLayout layout dynamically--*/
return layout ;
}
public RelativeLayout AddTakes(){
    RelativeLayout layout = new RelativeLayout(this);
    /*--Adding another set TextViews, EditTexts, RadioButtons in RelativeLayout layout dynamically--*/
return layout ;
}

when I click the EditText the error occur and code is here 当我单击EditText时出现错误,代码在这里

06-30 02:19:16.136: E/AndroidRuntime(12234): Process: com.example.justfortest, PID: 12234
06-30 02:19:16.136: E/AndroidRuntime(12234): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
06-30 02:19:16.136: E/AndroidRuntime(12234):    at                android.view.ViewGroup.addViewInner(ViewGroup.java:3759)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.addView(ViewGroup.java:3612)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.addView(ViewGroup.java:3557)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.addView(ViewGroup.java:3533)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at com.example.justfortest.RelativeLayoutListAdapter.getView(RelativeLayoutListAdapter.java:52)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.AbsListView.obtainView(AbsListView.java:2733)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.ListView.makeAndAddView(ListView.java:1801)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.ListView.fillSpecific(ListView.java:1348)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.ListView.layoutChildren(ListView.java:1619)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.AbsListView.onLayout(AbsListView.java:2546)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.View.layout(View.java:15631)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.layout(ViewGroup.java:4856)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.View.layout(View.java:15631)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.layout(ViewGroup.java:4856)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.View.layout(View.java:15631)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.layout(ViewGroup.java:4856)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:429)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.View.layout(View.java:15631)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.layout(ViewGroup.java:4856)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.View.layout(View.java:15631)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewGroup.layout(ViewGroup.java:4856)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2245)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1967)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1199)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6383)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.Choreographer.doCallbacks(Choreographer.java:603)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.Choreographer.doFrame(Choreographer.java:573)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.os.Handler.handleCallback(Handler.java:733)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.os.Handler.dispatchMessage(Handler.java:95)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.os.Looper.loop(Looper.java:157)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at android.app.ActivityThread.main(ActivityThread.java:5293)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at java.lang.reflect.Method.invokeNative(Native Method)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at java.lang.reflect.Method.invoke(Method.java:515)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
06-30 02:19:16.136: E/AndroidRuntime(12234):    at dalvik.system.NativeStart.main(Native Method)

The cause for the crash is: 崩溃的原因是:
The Relative layout present in the ArrayList is getting added to The layout more than once. ArrayList中存在的相对布局被多次添加到The layout中。

Your approach for dynamically adding edit/radio button isn't right. 您动态添加编辑/单选按钮的方法不正确。

ListView has Three components ListView具有三个组件

  1. Data:That you wan to the user 数据:您想要吸引用户
  2. View: UI through which you want to show the data(visual representation of data) 视图:您要通过其显示数据的UI(数据的直观表示)
  3. Adapter: the peice of code that connects data to the UI 适配器:将数据连接到UI的代码段

Listview generally contain homogeneous Views(Thus android renders only the number of views required to fill the screen after which point scrolling only recycles the same views,but fills it different data supplied by the ListItems. All of this happens in the getView method. Listview通常包含同类Views(因此android仅渲染填充屏幕所需的视图数量,此后滚动仅回收相同的视图,但填充ListItems提供的不同数据。所有这些都发生在getView方法中。

If you observe there is a convertView passed into getView method ,this is the view that can be recycled. 如果您观察到有一个convertView传递给getView方法,则该视图可以回收。

Now you have used List (Which is UI) as Data 现在,您已将列表(哪个是UI)用作数据

Your code should be appear like this 您的代码应如下所示
I have not executed this code. 我尚未执行此代码。 I would strongly recommend you to look into android SDK/Samples 我强烈建议您研究android SDK / Samples
You have to get lot of concepts right. 您必须正确掌握许多概念。

Main Activity 主要活动
` `

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    layoutlist = new ArrayList<DataSet>();
     mDrawerList = (ListView) findViewById(R.id.container);

    layoutlist.add(CreatDataSet());
    adapter = new RelativeLayoutListAdapter(this, R.layout.layout_container,layoutlist );

    mDrawerList.setAdapter(adapter);
    }
   DataSet CreateDataSet()
{
   DataSet data=new DataSet();
   //data.setRadioButton(true);
   //data.setEditBox(true);
}

class DataSet
{
boolean radioButton;//getter and setters
boolean editBox;/getters and setters
int viewType;//This tells what kind of view this data represents
}

` `

Adapter code:(This is the place you would bind the data to the view) 适配器代码:(这是将数据绑定到视图的地方)

    public class RelativeLayoutListAdapter extends ArrayAdapter<RelativeLayout> {

Context context;
List<DataSet> layoutItemList;
int layoutResID;

public RelativeLayoutListAdapter(Context context, int layoutResourceID,
        List<DataSet> listItems) {
    super(context, layoutResourceID, listItems);
    this.context = context;
    this.layoutItemList = listItems;
    this.layoutResID = layoutResourceID;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    LayoutItemHolder layoutHolder;
    View view = convertView;

    if (view == null) {
       view=createDynamicLayout();
       LayoutItemHolder layoutItem=new LayoutItemHolder();
       layoutItem.rb= (RadioButton)view.findViewById(R.id.radioButton1);
       view.setTag(layoutHolder);

    } 

     LayoutItemHolder holder =view.getTag();
     //holder.rb

    return view;
}

public int getViewTypeCount()
{
return ;// Return the number of different tyoes of views
}

public int getItemViewType(int position)
{
return layoutItemList.get(position).getViewType();// the type of view for the current position
}

//The purpose of layout holder is to do all findviewbyids only when the createDynamicLayout is called
private static class LayoutItemHolder {
    EditView e;
    TextView t;
    RadioButton rb;
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM