2016-07-16 157 views
1

UserAdapter.java:添加按鈕單擊事件中RecyclerView

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UsersViewHolder> { 
    private List<Users> usersList; 
    private ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 
    private Context mContext; 

    public class UsersViewHolder extends RecyclerView.ViewHolder { 
     public TextView txtUsername, txtCreatedAt; 
     public NetworkImageView imgUser; 
     public ImageButton btnMsg, btnDel; 

     public UsersViewHolder(View view) { 
      super(view); 
      txtUsername = (TextView) view.findViewById(R.id.txt_username); 
      txtCreatedAt = (TextView) view.findViewById(R.id.txt_created_at); 
      imgUser = (NetworkImageView) view.findViewById(R.id.img_user); 
      btnMsg = (ImageButton) view.findViewById(R.id.btn_msg); 
      btnDel = (ImageButton) view.findViewById(R.id.btn_delete); 
     } 

    } 

    public UsersAdapter(Context context, List<Users> usersList) { 
     mContext = context; 
     this.usersList = usersList; 
    } 

    @Override 
    public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.users_list_row, parent, false); 
     return new UsersViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(UsersViewHolder holder, int position) { 
     Users users = usersList.get(position); 
     holder.txtUsername.setText(users.getUserName() + " " + users.getUserSurname()); 
     holder.txtCreatedAt.setText(users.getCreatedAt()); 

     if (imageLoader == null) 
      imageLoader = AppController.getInstance().getImageLoader(); 
     holder.imgUser.setImageUrl(users.getUserImgPath(), imageLoader); 

     holder.btnMsg.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(mContext, "Clicked", Toast.LENGTH_SHORT); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return usersList.size(); 
    } 
} 

AppliersActivity:

public class AppliersActivity extends AppCompatActivity { 
    private static final String TAG = AppliersActivity.class.getSimpleName(); 

    private SQLiteHandler db; 
    private SessionManager session; 
    private ProgressDialog pDialog; 

    private String uid, api_key, adId; 

    private List<Users> usersList = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private UsersAdapter mAdapter; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_appliers); 

     definitions(); 

     getAppliers(); 
    } 

    private void definitions() { 
     adId = getIntent().getStringExtra("adId"); 

     // Progress dialog 
     pDialog = new ProgressDialog(this); 
     pDialog.setCancelable(false); 

     // SqLite database handler 
     db = new SQLiteHandler(getApplicationContext()); 

     // session manager 
     session = new SessionManager(getApplicationContext()); 

     if (!session.isLoggedIn()) { 
      logoutUser(); 
     } 

     // Fetching user details from sqlite 
     HashMap<String, String> user = db.getUserDetails(); 
     uid = user.get("uid"); 
     api_key = user.get("api_key"); 

     recyclerView = (RecyclerView) findViewById(R.id.appliers_recycler_view); 

     mAdapter = new UsersAdapter(getApplicationContext(), usersList); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); 
     recyclerView.setAdapter(mAdapter); 

     recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new OnTouchActionListener() { 
      @Override 
      public void onLeftSwipe(View view, int position) { 

      } 

      @Override 
      public void onRightSwipe(View view, int position) { 

      } 

      @Override 
      public void onClick(View view, int position) { 
       String adId = usersList.get(position).getUserId(); 

      } 
     })); 
    } 

    public static interface OnTouchActionListener { 
     public void onLeftSwipe(View view, int position); 
     public void onRightSwipe(View view, int position); 
     public void onClick(View view, int position); 
    } 

    public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 
     private OnTouchActionListener mOnTouchActionListener; 
     private GestureDetectorCompat mGestureDetector; 

     public RecyclerTouchListener(Context context, final RecyclerView recyclerView, OnTouchActionListener onTouchActionListener) { 
      mOnTouchActionListener = onTouchActionListener; 
      mGestureDetector = new GestureDetectorCompat(context,new GestureDetector.SimpleOnGestureListener(){ 
       @Override 
       public boolean onSingleTapUp(MotionEvent e) { 
        return true; 
       } 

       @Override 
       public void onLongPress(MotionEvent e) { 
       } 
      }); 
     } 

     @Override 
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 

      View child = rv.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && mOnTouchActionListener != null && mGestureDetector.onTouchEvent(e)) { 
       mOnTouchActionListener.onClick(child, rv.getChildPosition(child)); 
      } 
      return false; 
     } 

     @Override 
     public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
     } 

     @Override 
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

     } 
    } 

    private void getAppliers() { 
     // Tag used to cancel the request 
     String tag_string_req = "req_appliers"; 

     pDialog.setMessage("Lütfen Bekleyin..."); 
     showDialog(); 

     StringRequest strReq = new StringRequest(Request.Method.GET, 
       ApiRoutes.URL_JOB_APPLIERS+ "/" + adId, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       Log.d(TAG, "Appliers Response: " + response.toString()); 
       hideDialog(); 

       try { 
        JSONObject jObj = new JSONObject(response); 
        boolean error = jObj.getBoolean("error"); 

        // Check for error node in json 
        if (!error) { 
         usersList.clear(); 
         mAdapter.notifyDataSetChanged(); 
         JSONArray usersArray = jObj.getJSONArray("appliers"); 
         Users users; 
         for (int i = 0; i < usersArray.length(); i++) { 
          JSONObject jsonobject = usersArray.getJSONObject(i); 
          users = new Users(jsonobject.getString("uid"), jsonobject.getString("name"), jsonobject.getString("surname"), ApiRoutes.FOLDER_IMG + "/" + jsonobject.getString("uid") + "/profile_img.png", jsonobject.getString("created_at")); 
          usersList.add(users); 
         } 
         mAdapter.notifyDataSetChanged(); 
        } else { 
         String errorMsg = jObj.getString("error_msg"); 
         Toast.makeText(getApplicationContext(), 
           errorMsg, Toast.LENGTH_LONG).show(); 
        } 
       } catch (JSONException e) { 
        // JSON error 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e(TAG, "User Ads Error: " + error.getMessage()); 
       Toast.makeText(getApplicationContext(), 
         error.getMessage(), Toast.LENGTH_LONG).show(); 
       hideDialog(); 
      } 
     }) { 

      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       HashMap<String, String> headers = new HashMap<>(); 
       headers.put("Authorization", api_key); 

       return headers; 
      } 

     }; 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 
    } 

    private void showDialog() { 
     if (!pDialog.isShowing()) 
      pDialog.show(); 
    } 

    private void hideDialog() { 
     if (pDialog.isShowing()) 
      pDialog.dismiss(); 
    } 

    /** 
    * Logging out the user. Will set isLoggedIn flag to false in shared 
    * preferences Clears the user data from sqlite users table 
    * */ 
    private void logoutUser() { 
     session.setLogin(false); 

     db.deleteUsers(); 

     // Launching the login activity 
     Intent intent = new Intent(this, LoginActivity.class); 
     startActivity(intent); 
     finish(); 
    } 
} 

我有recyclerviewer的行中的兩個的ImageButton。我想爲每一行添加點擊事件。我將applicationcontext從活動發送到適配器。我添加到適配器類中的onclicklistener事件。但它不顯示烤麪包在屏幕上。我怎麼解決這個問題 ?

回答

2

您不要在適配器類中調用Toast的show()方法。

其更改如下

holder.btnMsg.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(mContext, "Clicked", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
+1

我犯了低級錯誤,花了我1小時。謝謝 :) –