从列表中删除元素(Remove elements from list)
我有一个变量:
x = 4
我有一个清单:
list = [{'name': u'A', 'value': '1'}, {'name': u'B', 'value': '4'}, {'name': u'C', 'value': '2'}]
如何排除/删除列表中value = x的元素?
I have a variable:
x = 4
And I have a list:
list = [{'name': u'A', 'value': '1'}, {'name': u'B', 'value': '4'}, {'name': u'C', 'value': '2'}]
How can I exclude/remove the element in list where value=x?
原文:https://stackoverflow.com/questions/9342400
最满意答案
有很多解决方案。 一个简单的方法是使用所谓的“保留”片段。 这是一种在某些Google示例中使用的方法。 保留片段没有UI,并且在方向更改时保持不变。 这通常被定义为您的活动的静态内部类,如下所示:
public static class RetainFragment extends Fragment { private static final String TAG = "RetainFragment"; public RetainFragment() {} public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) { RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG); if (fragment == null) { fragment = new RetainFragment(); } return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } }
然后,将您的AsyncTask放入RetainFragment中。 当
onPostExecute
,您可以简单地使用片段的getActivity()
方法来获取它所附加的Activity。希望有所帮助,让我知道是否还有一些困惑!
编辑: 以下是保留片段的Google示例
编辑2 :(根据评论)
public class A { // This class holds a reference to it's outer A instance. It can be // accessed using A.this. public class innerClassA { //... } // This class does not hold a reference to it's outer A instance. public static class innerClassB { //... } }
编辑3:在评论中,我最终还是编写了完整的代码。 对任何感兴趣的人
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Button b = (Button) findViewById(R.id.aaa); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RetainFragment retainFragment = RetainFragment.findOrCreateRetainFragment(getFragmentManager()); retainFragment.loadAsync(); } }); } private void handleResponse(String response) { // do something with the response... } public static class RetainFragment extends Fragment { private static final String TAG = "RetainFragment"; public RetainFragment() { } public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) { RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG); if (fragment == null) { fragment = new RetainFragment(); fm.beginTransaction().add(fragment, TAG).commit(); } return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } private void loadAsync() { new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { // Do some work... return null; } @Override protected void onPostExecute(String response) { MyActivity myActivity = (MyActivity)getActivity(); if (myActivity != null) { myActivity.handleResponse(response); } } }.execute(); } } }
There are plenty of solutions to this. One simple one for you is to use what's known as a "Retain" fragment. This is an approach that is used in some of the Google samples. A retain fragment has no UI, and persists across orientation change. This is usually defined as a static inner class of your activity like so:
public static class RetainFragment extends Fragment { private static final String TAG = "RetainFragment"; public RetainFragment() {} public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) { RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG); if (fragment == null) { fragment = new RetainFragment(); } return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } }
Then, put your AsyncTask inside of your RetainFragment. When
onPostExecute
is called, you can simply use the fragment'sgetActivity()
method to get the Activity that it is attached to.Hope that helps, let me know if there is still some confusion!
Edit: Here is a Google sample of a retain fragment
Edit 2: (as per comments)
public class A { // This class holds a reference to it's outer A instance. It can be // accessed using A.this. public class innerClassA { //... } // This class does not hold a reference to it's outer A instance. public static class innerClassB { //... } }
Edit 3: In the comments, I ended up writing the full code anyway. For anyone interested:
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Button b = (Button) findViewById(R.id.aaa); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { RetainFragment retainFragment = RetainFragment.findOrCreateRetainFragment(getFragmentManager()); retainFragment.loadAsync(); } }); } private void handleResponse(String response) { // do something with the response... } public static class RetainFragment extends Fragment { private static final String TAG = "RetainFragment"; public RetainFragment() { } public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) { RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG); if (fragment == null) { fragment = new RetainFragment(); fm.beginTransaction().add(fragment, TAG).commit(); } return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } private void loadAsync() { new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { // Do some work... return null; } @Override protected void onPostExecute(String response) { MyActivity myActivity = (MyActivity)getActivity(); if (myActivity != null) { myActivity.handleResponse(response); } } }.execute(); } } }