Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义适配器';s的异步行为_Java_Android_Android Adapter - Fatal编程技术网

Java 自定义适配器';s的异步行为

Java 自定义适配器';s的异步行为,java,android,android-adapter,Java,Android,Android Adapter,我已经在我的android应用程序中创建了自己的自定义适配器类,我正在通过我的一个活动调用它。我正在从adapter类向视图添加一些元素,需要从activity类访问这些变量 现在,理想情况下,我希望它填充视图,然后在我的activity类中执行进一步的代码,但是adapter类需要一些时间来填充视图,同时在activity类中执行进一步的代码,其中还没有添加这样的元素。 我如何处理这种情况?我有js背景。我们在java中有类似承诺的东西吗 根据答案,我已将代码更改为: public class

我已经在我的android应用程序中创建了自己的自定义适配器类,我正在通过我的一个活动调用它。我正在从adapter类向视图添加一些元素,需要从activity类访问这些变量

现在,理想情况下,我希望它填充视图,然后在我的activity类中执行进一步的代码,但是adapter类需要一些时间来填充视图,同时在activity类中执行进一步的代码,其中还没有添加这样的元素。 我如何处理这种情况?我有js背景。我们在java中有类似承诺的东西吗

根据答案,我已将代码更改为:

public class HomeActivity extends Activity {

    GridView grid;
    String text[] = {"Calendar","Uber","Weather","News","Youtube","Clock","Email","Maps","Twitter","Facebook"};
    String list_app_name[] = {"calendar","uber","weather","news","youtube","clock","email","maps","twitter","facebook"};
    String id_button[] = {"button_calendar","button_uber","button_weather","button_news","button_youtube","button_clock","button_email","button_maps","button_twitter","button_facebook"};
    int image[] = {R.drawable.social_icons1,R.drawable.social_icons2,R.drawable.social_icons3,R.drawable.social_icons4,
            R.drawable.social_icons5,R.drawable.social_icons6, R.drawable.social_icons7,R.drawable.social_icons8,
            R.drawable.social_icons9,R.drawable.social_icons10};
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_home);

        //setting up the adapter for gridView
        grid = (GridView)findViewById(R.id.simpleGrid);
        ImageAdapter ia = new ImageAdapter(this,image,text,id_button);
        grid.setAdapter(ia);

        ia.notifyDataSetChanged();

        try {
            initStateOfApps();
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    public void initStateOfApps() throws JSONException {
        Log.d("here","here");
        ArrayList<String> list = getEnabledApps();
        Log.d("apps",list.toString());
        for(int i=0;i<list.size();i++) {
            String app_name = list.get(i);

            ToggleButton button=null;
            if(app_name.equals("calendar")) {
                button = (ToggleButton)findViewById(R.id.button_calendar);
                button.setChecked(true);
            } 

        }
    }
}
在java中,我们有
,但我认为这不是您想要的

adapter(扩展
BaseAdaper
)行为允许您创建适配器,甚至在瞬间,也可以通过getAdapter().setData()或您选择添加的任何方法更改基础数据

从这个角度来看,适配器是一个充当视图容器的“愚蠢”组件,您应该在别处检索数据(CursorAdapter不同)


因此,在您的活动中,用所需的数据填充适配器,完成后,调用adapter.notifyDatasetChanged()。这将通知适配器它自己的数据已更改,它必须刷新视图。是的,理想情况下,适配器的填充应该来自外部。适配器实际上应该只接收数据列表并将该数据映射到视图。例如,“活动”中的某个方法或任务可以生成一个数据列表(可能是异步的……因为您提到了它),然后将其传递到适配器中,如果需要,您可以通知DataSetChanged()

我看不到您的代码,但是如果出于某种原因确实需要从适配器内部填充数据,您可以使用事件总线并在活动中订阅它。我建议使用第一个选项,但如果您选择使用事件总线,这里有一些链接:


根据我对你问题的理解 未正确管理活动中的适配器数据。 如果任何数据或代码与适配器数据或值链接 然后,您可以在检索值或数据并更新活动中的视图后启动这些代码。 请注意,在适配器中使用ViewHolder可以避免在ListView中缓慢填充和滚动。 视图持有者将使您的过程更加顺畅

我个人建议你 请使用RecycleView和RecycleWebAdapter。 很多安卓开发者都在使用它

若您在适配器中有后台任务,那个么您可以选择使用RXJava或EventBus

如果你提供代码
我们最好建议您尝试访问
视图的确切解决方案,该视图不属于
活动的内容视图。因此,您无法直接访问该视图

button = (ToggleButton)findViewById(R.id.button_calendar); // will return null
此ToggleButton将为null,因为findViewById将无法在当前内容视图中找到ToggleButton,因为该视图存在于适配器中,而不是在内容视图中

您正在获取nullpointerException,因为您正在尝试访问null视图上的属性

button.setChecked(true); // This button is null

你能展示你的照片吗code@Rasi我已更新我的答案。我尝试使用adapter.notifyDatasetChanged()但未成功。我已更新我的答案以包含代码。我正在将上下文传递给适配器类,并使用与我的活动类相同的视图。发布ImageAdapter类的代码,或告诉我您正在适配器类中膨胀的视图。执行此操作。请稍等。使用相同的视图绝不意味着引用将相同。参考是不同的。使用模型类,并在该过程中使用布尔值,它将决定项目是否被选中。谷歌它-你会发现许多例子。我发现的一个是。给你-
button.setChecked(true); // This button is null