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

时间:2014-07-09 17:37:17

标签: android listview android-arrayadapter onclicklistener

我正在处理包含listview的片段(此片段是在创建活动时生成的PlaceHolderFragment)。我扩展了ArrayAdapter来制作我的自定义适配器并用这个适配器填充我的listview。

一个重要的事情是在列表视图的一行中,有2个按钮:首先是启用/禁用按钮以更改用户的状态(当用户的状态处于活动状态时,它将被禁用,否则启用),第二个是删除按钮(删除用户)。所以我必须在适配器

的方法getView()中为这2个按钮实现OnClickListener

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

但是在我点击该按钮后,它的状态没有改变(我的意思是如果用户已启用,现在按钮必须更改为禁用,或者如果删除用户,则必须从屏幕中删除该行)。我必须手动重新加载这个片段(切换到其他片段,然后再回来)

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

注意:notifyDataSetChanged()不起作用,因为适配器中的数据实际上还没有改变,只有服务器上的数据被更改

注2 :如果您需要我发布我的代码,请发表评论,我会编辑我的帖子,因为我认为我的代码很长

谢谢你,最诚挚的问候!

编辑1 我在下面的答案中发布了我的解决方案,它解决了问题,但我不得不说这是一个非常非常 BAD 在android中的做法。例如,当您想要使用此方法删除项目时,您可能希望为用户设置AlertDialog以进行确认,但AlertDialog只能在Activity(或Fragment)中显示,它无法从Adapter显示。因此,您应该使用一些不同的方法,例如ContextMenu或CustomDialog。

2 个答案:

答案 0 :(得分:4)

经过几周搜索谷歌并尝试不同的方法,我终于找到了一种存档我想要的方式,而且非常简单。我在这里发布我的答案,面向像我这样面临这个问题的人

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重新加载时需要实现的所有内容。希望你在遇到这个问题时发现它比我更容易

答案 1 :(得分:0)

根据您的问题,我可以根据您的需要点击其中一个按钮来刷新列表数据 现在你应该调用notifydataset更改而不是再次重新加载活动。 为此,您需要更改yu用于适配器的数组(不要只更改数组的数组对象) 像arraylst.get(index).activ = true等等然后调用notifiydataset更改。