将customadapter从自身传递给方法

时间:2018-01-11 23:36:26

标签: android custom-adapter notifydatasetchanged

我有一个扩展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}}。

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);
}