2014-07-09 48 views
3

我正在处理包含listview的片段(此片段是创建活动时生成的PlaceHolderFragment)。我扩展了ArrayAdapter来制作自定义适配器,并使用此适配器填充我的列表视图。如何从ArrayAdapter中的onClickListener重新加载活动

一个重要的是在一行listview中,有2个按钮:第一个是启用/禁用按钮来改变用户的状态(当用户的状态是活动的,然后禁用,否则启用),第二个是删除按钮(删除用户)。因此,我必须在适配器的方法getView()中为此2个按钮实现OnClickListener。

当单击其中一个按钮时,它将向服务器发送请求并操作数据库(更改用户状态或从数据库中删除用户)。当我点击启用按钮(例如),它是成功和数据库中用户的状态改变,或者当我点击删除按钮,用户将成功从数据库删除

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

问题是我该如何重新加载活动(我已经实现onResume加载所有数据到适配器,所以如果我可以使这个方法onResume的片段运行,它会按我的期望工作),或者至少我如何重新加载列表视图来更新新的数据?

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

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

谢谢,最好的问候!

编辑1 我已为我的回答下面的解决方案,它解决了问题,但我不得不说,这是在Android中一个非常非常BAD实践。例如,当您想要使用此方法删除某个项目时,可能需要为用户确认一个AlertDialog,但AlertDialog只能显示在Activity(或Fragment)中,无法从Adapter中显示。相反,您应该使用一些不同的方法,如ContextMenu或CustomDialog。

+0

你能分享一下你试过的代码吗? – MTahir

+0

@MTahir:谢谢你看看我的问题,但现在我终于找到了我在 –

回答

3

经过几个星期的搜索谷歌和尝试不同的方法,我终于找到了一种方法来存档我想要的,它非常简单。我在这里发布我的答案的人在未来

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情况下重装。希望你的家伙在遇到这个问题时比我容易找到

+0

以下发布的答案为什么不直接使用'this.notifyDataSetChanged();'? – Rule

+0

@规则:如果您删除此行items.remove(item),则适配器中的数据实际上不会更改;然后调用adapter.notifyDataSetChanged();什么也没做 –

+0

它对我来说是完美的(如果有人放弃这个,首先阅读代码中的注释) – Bahu

0

我从你的问题中了解到,如果你想刷新列表数据,当你点击一个按钮时,你需要。
现在您应该调用notifydataset更改,而不是重新加载活动。 为此,您需要更改yu用于适配器的数组(不要更改数组对象,只是数组的项目) like arraylst.get(index).activ = true等等,然后调用notifiydataset更改。

相关问题