0

帮助解决此类问题。我有一个包含很多项目的ScrollView。在它的底部,我添加了一组来自另一个活动的项目。我检查从另一个活动输入ArrayList,并应该添加适当数量的复选框到我的Activity与ScrollView。我添加这样的项目:动态删除LinearLayout中动态添加的视图

public void addFiles() 
{ 

     LinearLayout layout = (LinearLayout) findViewById(R.id.filesList); 

     if(!FileManagerActivity.finalAttachFiles.isEmpty()) 
     { 

      for (int i=0; i<FileManagerActivity.finalAttachFiles.size();i++) 
      { 

       View line = new View(this); 
       line.setLayoutParams(new LayoutParams(1, LayoutParams.MATCH_PARENT)); 
       line.setBackgroundColor(0xAA345556); 
       informationView= new CheckBox(this); 
       informationView.setTextColor(Color.BLACK); 
       informationView.setTextSize(16); 
       informationView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); 
       informationView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.file_icon, 0, 0, 0); 
       informationView.setText(FileManagerActivity.finalAttachFiles.get(i).getName().toString()); 
       informationView.setId(i); 
       layout.addView(informationView, 0); 
       layout.addView(line, 1); 
       layout.postInvalidate(); 
      } 
     } 

} 

一切正常添加。比我创建单独的ArrayList与应保存复选框的可检查的状态:

for(int b=0;b<FileManagerActivity.finalAttachFiles.size();b++){  
    checks.add(b,0); 
} 
btnClose.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View view) { 
    moveTaskToBack(true); 
    } 
}); 

其中FileManagerActivity.finalAttachFiles是从另一个活动ArrayList中。我保存这样的可检查状态:

public void getChecked() 
{ 

    LinearLayout layout = (LinearLayout) findViewById(R.id.filesList); 
    View v = null; 
    for(int i=0; i< FileManagerActivity.finalAttachFiles.size(); i++) { 

    v = layout.getChildAt(i);  
    CheckBox checkBox = (CheckBox) findViewById(i); 
    boolean checked=checkBox.isChecked(); 
    if (checked) 
    { 
    checks.set(i, 1); 
    } 
    else 
    { 
     checks.set(i, 0); 
    } 
    } 
} 

然后我想删除那些用Button检查过的项目。我这样做:

btnFilesRemove.setOnClickListener(new View.OnClickListener() { 

public void onClick(View view) { 

    LinearLayout layout = (LinearLayout) findViewById(R.id.filesList); 
    getChecked(); 
    for (int i=0;i< checks.size();i++) 
    { 

    if (checks.get(i)==1) 
    { 
     View v = layout.getChildAt(i); 
     ViewGroup parent = (ViewGroup) v.getParent(); 
     parent.removeView(v); 
     layout.invalidate(); 
    } 
    else 
    { 
     Log.i("wasn't checked",Integer.toString(checks.get(i))); 
    } 

    } 
} 
}); 

但是,当我这样做只有项目可以被删除,而不是那些被检查。当我尝试删除一个更多的时间,我得到一个:

09-03 13:12:32.569: E/AndroidRuntime(1600): FATAL EXCEPTION: main 
09-03 13:12:32.569: E/AndroidRuntime(1600): java.lang.NullPointerException 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at com.assignmentexpert.NewOrderActivity.getChecked(NewOrderActivity.java:307) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at com.assignmentexpert.NewOrderActivity$4.onClick(NewOrderActivity.java:149) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at android.view.View.performClick(View.java:2485) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at android.view.View$PerformClick.run(View.java:9080) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at android.os.Handler.handleCallback(Handler.java:587) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at android.os.Looper.loop(Looper.java:123) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
09-03 13:12:32.569: E/AndroidRuntime(1600):  at dalvik.system.NativeStart.main(Native Method) 

我试图通过使用ListView控件来实现这一点,但它会导致使用滚动型的原因可视化的问题,但功能正常工作...告诉我请,我怎样才能更好地实现:继续使用LinearLayout或ListView实现。

回答

0

集onCheckChangeListener上,您已经创建

informationView.setTag(i); 
informationView.setOnCheckedChangeListener(new OnCheckedChangeListener{ 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){ 
     final Integer position=(Integer) buttonView.getTag(); 
     if(position!=null){ 
      if (ischecked){ 
       checks.set(i, 1); 
      }else { 
       checks.set(i, 0); 
      } 
     } 
    } 
}); 
+0

我做到了,并且工作正常的所有复选框 - 检查可以正确创建...问题是意见中删除...... –

+0

@RikkiTikkiTavi检查此问题http://stackoverflow.com/questions/3995215/add-and-remove-views-in-android-dynamically –

+0

谢谢,但我解决了它通过使用页脚和标题listView而不是scrollView ... –