我有一个扩展BaseAdapter的customAdapter。在这个customAdapter中,我从另一个类调用一个方法,该类需要这个customAdapter作为参数。所以基本上我想实现这个目标:
public class customAdapter extends BaseAdapter {
public View getView(final int i, View view, ViewGroup viewGroup) {
className.someMethod(arg1, arg2, this customAdapter);
}
}
这背后的原因是,在方法内部,包含此customAdapter数据的数组已更新,并且在更新后我想调用
notifiyDataSetChanged();
在adpater上。
我也尝试在所述方法中返回数组,然后调用notifiyDataSetChanged();在customAdapter类中,但数组有点混乱。
在此活动中是我想要填充数据的listView:
public class activity_1_5_friendslist extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override protected void onCreate(Bundle savedInstanceState) {
customFriendsListAdapter= new customAdapter_CustomFriendsListAdapter(activity_1_5_friendslist.this,friendsList);
friendsListListView = findViewById(R.id.friendsListListView);
friendsListListView.setAdapter(customFriendsListAdapter);
// API-Call to get data
API.getFriends(activity_1_5_friendslist.this, preFriendsList, friendsList, friendsListProgressBar, friendsListTextView, customFriendsListAdapter);
}
}
在listView的每一行中有按钮,例如" declineFriends&#34 ;.在我的customAdapter中,我得到了以下内容:
public class customAdapter_CustomFriendsListAdapter extends BaseAdapter {
customAdapter_CustomFriendsListAdapter adapter;
public customAdapter_CustomFriendsListAdapter(Context c, ArrayList<Object> friendsList){
this.friendsList=friendsList;
friendsListInflater= (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
context=c;
}
@Override public View getView(final int i, View view, ViewGroup viewGroup) {
holder.declineFriendImageButton.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
// make call that friend reqeust was declined, delete friendObject from arrayList and refresh adapter
API.declineFriend(context, pubKey, friendsList, i, adapter);
}
}
}
这是declineFriend-method:
public void declineFriend(Context context, String pubKey, final ArrayList<Object> friendsList, final int i, final customAdapter_CustomFriendsListAdapter adapter){
requestQueue= Volley.newRequestQueue(context);
String userID = getUserId();
url = "someURL";
Log.d(TAG, "declineFriend: "+i);
StringRequest dr = new StringRequest(Request.Method.DELETE, url,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
friendsList.remove(i);
adapter.notifyDataSetChanged();
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
// error.
}
}
);
requestQueue.add(dr);
}
在适配器的方法中使用此this
代替adapter
无法正常工作,因为我在此onClickListener
并且这给了我listener
而不是{ {1}}。
答案 0 :(得分:1)
需要这个customAdapter作为参数。
使用这个而不是适配器中的方法中的适配器不起作用,因为Im在这个onClickListener中,这给了我监听器而不是适配器
您只需通过this
。更具体地说,CustomAdapter.this
或者删除那里的参数,并将其传递给className
的构造函数。
但是,如果要执行此类操作,则应使用回调接口,而不是将适配器耦合到外部类。
大多数Android操作已经在使用回调,即使您没有意识到这一点。单击按钮和Volley响应只是您已经使用的两个示例。
要创建自己的,您将定义一个接口,该接口接受已删除的ID作为参数。然后,当您调用外部方法时,它会通知适配器删除该元素。然后适配器知道它需要更新自己。
public class CustomAdapter<E> extends ArrayAdapter<E> {
public static class OnUpdateListener {
void onRemove(String id);
}
public View getView(final int i, View view, ViewGroup viewGroup) {
className.someMethod(arg1, arg2, new CustomAdapter.OnUpdateListener() {
@Override public void onRemove(String id) {
remove(id);
}
});
}
}
在另一个班级
void someMethod(Object arg1, Object arg2, final CustomAdapter.OnUpdateListener callback) {
// Do some things
// Get some data
String userID = getUserId();
// notify back to the adapter
callback.onRemove(userID);
}