2017-08-29 3 views
2

Ich arbeite an einer Messaging-Anwendung. Jetzt in der Konversation Aktivität Ich möchte eine Option für den Absender löschen können seine Nachricht.Ich mache es mit einem Knopf und es funktioniert gut. Das Problem ist, ich möchte es mit einer alertDialogBox machen. Wenn der Absender lange auf seine Nachricht drückt, öffnet sich ein Dialogfeld und er kann diese spezifische Nachricht löschen. Wie kann ich nach dem Nachrüsten auf diese Weise die Nachricht löschen?How to Delete Nachricht mit AlertDialogBox von API-Antwort in Adapter-Klasse

Hier ist meine individuelle Adapterklasse:

public class Single_chat_adapter extends RecyclerView.Adapter{ 

private static final int VIEW_TYPE_MESSAGE_SENT = 1; 
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2; 


private Context mContext; 
private List<Datum2> data; 
private String userID; 

private UserAuthenticationKey userAuthenticationKey; 
private SharedPreferences sharedPreferences; 
private SharedPreferences.Editor editor; 


public Single_chat_adapter(Context mContext, List<Datum2> data, String userID) { 
    this.mContext = mContext; 
    this.data = data; 
    this.userID = userID; 
} 

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


// Determines the appropriate ViewType according to the sender of the message. 
@Override 
public int getItemViewType(int position) { 
    Datum2 message = (Datum2) data.get(position); 

    if (message.getOriginatorId().equals(userID)) { 
     // If the current user is the sender of the message 
     return VIEW_TYPE_MESSAGE_SENT; 
    } else { 
     // If some other user sent the message 
     return VIEW_TYPE_MESSAGE_RECEIVED; 
    } 
} 
// Inflates the appropriate layout according to the ViewType. 
@Override 
public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 

    View view; 
    if (viewType == VIEW_TYPE_MESSAGE_SENT) { 
     view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_message_sent, parent, false); 
     return new SentMessageHolder(view); 

    } else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED){ 
     view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_message_received, parent, false); 
     return new ReceivedMessageHolder(view); 
    } 
    return null; 
} 
// Passes the message object to a ViewHolder so that the contents can be bound to UI. 
@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    Datum2 message = (Datum2) data.get(position); 

    switch (holder.getItemViewType()) { 
     case VIEW_TYPE_MESSAGE_SENT: 
      ((SentMessageHolder) holder).bind(message); 

      break; 
     case VIEW_TYPE_MESSAGE_RECEIVED: 
      ((ReceivedMessageHolder) holder).bind(message); 
    } 

    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(final View view) { 

      return false; 
     } 
    }); 

} 

// Sent message view holder 
private class SentMessageHolder extends RecyclerView.ViewHolder { 
    TextView messageText, timeText; 
    ImageButton iB; 
    MsgDltAPIService msgDltAPIService; 
    String rec_id; 
    String content_id; 
    final int[] ids = new int[100]; 

    SentMessageHolder(final View itemView) { 
     super(itemView); 

     messageText = itemView.findViewById(R.id.text_message_body); 
     timeText = itemView.findViewById(R.id.text_message_time); 
     iB = itemView.findViewById(R.id.sentMessageTextDelete); 
     msgDltAPIService = RestClient.getClient().create(MsgDltAPIService.class); 

     iB.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       userAuthenticationKey = new UserAuthenticationKey(mContext.getApplicationContext()); 
       sharedPreferences = mContext.getApplicationContext().getSharedPreferences("user authentication", MODE_PRIVATE); 
       editor = sharedPreferences.edit(); 

       ids[0] = Integer.parseInt(content_id); 

       if (!TextUtils.isEmpty(content_id) && TextUtils.isDigitsOnly(content_id)) { 
        ids[0] = Integer.parseInt(content_id); 
       } else { 
        ids[0] = 0; 
       } 
       final MsgDltRequest msgDltRequest = new MsgDltRequest(
         ids, 
         rec_id); 
       Call<MsgDltResponse> call = 
         msgDltAPIService.msgDlt(userAuthenticationKey.getUserTokenKey(), 
           msgDltRequest); 
       call.enqueue(new Callback<MsgDltResponse>() { 
        @Override 
        public void onResponse(Call<MsgDltResponse> call, Response<MsgDltResponse> response) { 

         Toast.makeText(mContext.getApplicationContext(), "message deleted", 
           Toast.LENGTH_LONG).show(); 
        } 

        @Override 
        public void onFailure(Call<MsgDltResponse> call, Throwable t) { 
         Toast.makeText(mContext.getApplicationContext(), "please try again", 
           Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 
     }); 
    } 

    void bind(Datum2 message) { 
     messageText.setText(message.getMsg()); 

     // Format the stored timestamp into a readable String using method. 
     timeText.setText(message.getCreatedAt().getFormatTime()); 
     content_id = message.getContentId().toString(); 
     if (! message.getOriginatorId().equals(userID)){ 
      rec_id.valueOf(message.getOriginatorId()); 
     } 
     else { 
      rec_id = null; 
     } 
    } 

} 

// Received message view holder 
private class ReceivedMessageHolder extends RecyclerView.ViewHolder { 
    TextView messageText, timeText, nameText; 
    //  ImageView profileImage; 
    HexagonImageView profileImage; 

    ReceivedMessageHolder(View itemView) { 
     super(itemView); 

     messageText = itemView.findViewById(R.id.text_message_body); 
     timeText = itemView.findViewById(R.id.text_message_time); 
     nameText = itemView.findViewById(R.id.text_message_name); 
     profileImage = itemView.findViewById(R.id.image_message_profile); 
    } 

    void bind(Datum2 message) { 
     messageText.setText(message.getMsg()); 

     // Format the stored timestamp into a readable String using method. 
     timeText.setText(message.getCreatedAt().getFormatTime()); 
     nameText.setText(message.getOriginator().getFullName()); 

     // Insert the profile image from the URL into the ImageView. 
     Glide.with(mContext).load("myweburl" + data.get(getLayoutPosition()) 
       .getOriginator().getAvatar()).apply(RequestOptions.circleCropTransform()) 
       .into(profileImage); 
    } 
} 
} 

ich eine Schaltfläche mit dem Namen iB, mit dem ich die Nachricht löschen. Leider habe ich es mit einer alertBox nicht geschafft.

Antwort

0

In Ihrem lang gedrückt Hörer, übergeben Sie das Nachrichtenobjekt an die übergeordnete Aktivität/Adapter mit Listener und dann von Eltern öffnen Sie ein Dialogfeld übergibt das Objekt, jetzt beim Löschen Ihrer Daten einfach entfernen Sie die Nachricht von List<Datum2> data und benachrichtigen Adapter

public class SingleChatAdapter extends RecyclerView.Adapter { 
// ... 
//... 
@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    Datum2 message = (Datum2) data.get(position); 
    switch (holder.getItemViewType()) { 
    case VIEW_TYPE_MESSAGE_SENT: 
    ((SentMessageHolder) holder).bind(message); 
    break; 
    case VIEW_TYPE_MESSAGE_RECEIVED: 
    ((ReceivedMessageHolder) holder).bind(message); 
    } 
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(final View view) { 
    mListener.onMessageLongPressed(message); 
    return false; 
    } 
    }); 
    } 
    // .... 
    // ... 

// here is the listener interface parent need to implement 
public interface OnChildInteraction { 
    public void onMessageLongPressed(Datum2 message); 
} 
} 

eine grobe Implementierung in Mutter

public class ParentActicvity extends AppCompatActivity implements SingleChatAdapter.OnChildInteraction 
@override 
public void onMessageLongPressed(Datum2 message){ 
    // override delete button listener to call list.remove(message) 
    // notify adapter. 
// open dialog 

} 
+0

ich bin wirklich traurig sein wird, und nicht verstehen, wo Schnittstelle OnChildInteraction und onMessageLongPressed Methode zu verwenden. Können Sie mir bitte einen Vorschlag machen? –

+0

siehe meine Bearbeitungen, die Sie verstehen –

+0

jetzt sehen Sie den aktualisierten Code bitte –