ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-如何从ArrayAdapter中的onClickListener重新加载活动

2019-10-29 10:25:32  阅读:183  来源: 互联网

标签:listview onclicklistener android-arrayadapter android


我正在处理一个包含列表视图的片段(此片段是在创建活动时生成的PlaceHolderFragment).我扩展了ArrayAdapter来制作我的自定义适配器,并用该适配器填充我的列表视图.

重要的一点是在列表视图的一行中,有2个按钮:第一个是启用/禁用按钮,用于更改用户的状态(当用户状态为活动时,则禁用,否则为启用),第二个是删除按钮(用于删除用户).所以我必须在适配器的方法getView()中为这2个按钮实现OnClickListener

单击任一按钮时,它将向服务器发送请求并操纵数据库(更改用户状态或从数据库中删除用户).事情是当我单击启用按钮(例如)时,成功并且数据库中的用户状态已更改,或者当我单击删除按钮时,用户将成功从数据库中删除

但是,单击该按钮后,它的状态不会更改(我的意思是如果启用了用户,那么现在该按钮必须更改为禁用,或者如果删除了用户,则必须从屏幕上删除该行).我必须手动重新加载此片段(切换到其他片段然后再回来)

问题是如何重新加载活动(我已经实现了onResume来将所有数据加载到适配器,所以如果我可以让此方法运行onResume的fragment,它将按我的预期工作),或者至少如何将listview重新加载到更新新数据?

注意:notifyDataSetChanged()无效,因为适配器中的数据实际上尚未更改,仅服务器上的数据已更改

注意2:如果您需要我发布代码,请发表评论,因为我的代码很长,所以我将编辑我的帖子.

感谢你并致以真诚的问候!

编辑1
我已经在下面的答案中发布了我的解决方案,它可以解决问题,但是我不得不说这是android中非常糟糕的做法.例如,当您想用这种方法删除一个项目时,您可能想放置一个AlertDialog供用户确认,但是AlertDialog只能在Activity(或Fragment)中显示,而不能从Adapter中显示.因此,您应该使用一些其他方法,例如ContextMenu或CustomDialog.

解决方法:

经过几周的Google搜索并尝试了不同的方法,我终于找到了一种方法来存档我想要的内容,而且非常简单.我在这里将答案发布给将来遇到像我这样的人

public class CustomAdapter extends ArrayAdapter<YourClass> {
    private List<YourClass> items;
    private CustomAdapter adapter;
    private Context context;
    private Button button;
    private YourClass item;

    public CustomAdapter(Context context, List<YourClass> items) {
        super(context, R.layout.custom_list_item, items);
        this.items = items;
        this.context = context;
        this.adapter = this; //This is an important line, you need this line to keep track the adapter variable
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        if (v == null) {
            LayoutInflater li = LayoutInflater.from(getContext());
            v = li.inflate(R.layout.custom_list_item, null);
        }
        item = items.get(position);

        button = (Button) v.findViewById(R.id.button); //Find the button
        button.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View view) {
                        //Do something inside here like update, remove your item...
                        //But the important is
                        items.remove(item); //Actually change your list of items here
                        adapter.notifyDataSetChanged(); //notify for change
                    }
                });
    }
    return v;
}

就这样,当您需要重新加载列表视图时,您需要执行的所有操作,以防您需要在适配器内部实现OnClick.希望您遇到这个问题时能比我发现容易

标签:listview,onclicklistener,android-arrayadapter,android
来源: https://codeday.me/bug/20191029/1959423.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有