2017-04-04 75 views
0

我有一個自定義對象的ArrayList。這個ArrayList傳遞給我的RecyclerView適配器。當事件發生時,我需要從ArrayList中檢索包含具有唯一值的變量的對象,對該對象進行更改,然後重新加載與該對象相對應的ViewHolder。我如何實現這一目標?如何重新加載recyclerview行而無需列表的位置?

問題是我沒有在ArrayList中的對象的位置,因爲位置不斷動態變化。我只有這個獨特的價值對應於我想要改變的對象。我試着做list.clear()然後重新分配對象與ArrayList與更新的值,然後調用adapter.notifyDataSetChanged(),但它不起作用。

編輯: 我提供以下含有recyclerview活動的代碼。實際的代碼要大得多,所以我決定編輯它只顯示關於這個問題的必要細節。請讓我知道是否需要添加更多代碼。

因此,基本上這裏發生的事情是,IMActivity綁定到服務並在綁定時將其上下文傳遞給服務。當服務中發生事件時,數據庫值發生更改,並在服務中調用updateActivity()。

我想要updateActivity()做的是檢查chatMsg對象的chatMsg對象,該對象包含一個具有唯一值的變量並重新加載對應於該ChatMsg對象的視圖。

請讓我知道,如果我需要進一步澄清。

public class IMActivity extends AppCompatActivity implements Sertivity { 

    private RecyclerView recyclerView; 
    private ImAdapter imAdapter; 
    private List<ChatMsg> chatMsgList = new ArrayList<>(); 
    EditText etIM; 
    ImageButton ibSend; 
    TalkSeeService.TalkSeeBinder talkSeeBinder; 
    String usernames[]= new String[10]; 
    String otherUserName; 
    List<Msg> msgList; 
    DBAct db; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     bindService(new Intent(com.abdralabs.talksee.IMActivity.this, TalkSeeService.class), new ServiceConnection() { 
      @Override 
      public void onServiceConnected(ComponentName name, IBinder service) { 
       talkSeeBinder = (TalkSeeService.TalkSeeBinder)service; 
       talkSeeBinder.setSertivity(com.abdralabs.talksee.IMActivity.this); 
      } 

      @Override 
      public void onServiceDisconnected(ComponentName name) { 
       talkSeeBinder.setSertivity(null); 
       talkSeeBinder = null; 
      } 
     },BIND_AUTO_CREATE); 

     setContentView(R.layout.activity_im); 
     recyclerView = (RecyclerView)findViewById(R.id.rv_im); 
     imAdapter = new ImAdapter(chatMsgList); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
     layoutManager.setStackFromEnd(true); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(imAdapter); 

     ibSend = (ImageButton)findViewById(R.id.ib_send); 
     etIM = (EditText)findViewById(R.id.et_im); 

     ibSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //THE TEXT FROM THE EDITTEXT IS TAKEN AND THEN ADDED TO THE DATABASE 
       updateChatData(); 
      } 
     }); 

     db = new DBAct(com.abdralabs.talksee.IMActivity.this,otherUserName); 
     msgList = db.getAllMessages(); 
     db.close(); 
     prepareChatData(); 
    } 


    private void prepareChatData() { 
     for (int i=0; i<msgList.size(); i++) { 
      ChatMsg chatMsg = new ChatMsg(msgList.get(i).getMessage(), 
        convertToDayDateTime(Long.valueOf(msgList.get(i).getTime())), 
        msgList.get(i).getOther(), 
        getReceiptFromDelivered(i)); 
      chatMsgList.add(chatMsg); 
     } 
     imAdapter.notifyDataSetChanged(); 
    } 

    private void updateChatData(){ 
     msgList = db.getAllMessages(); 
     db.close(); 
     int i = msgList.size() - 1; 
     ChatMsg chatMsg = new ChatMsg(msgList.get(i).getMessage(), 
       convertToDayDateTime(Long.valueOf(msgList.get(i).getTime())), 
       msgList.get(i).getOther(), 
       getReceiptFromDelivered(i)); 
     chatMsgList.add(chatMsg); 
     imAdapter.notifyDataSetChanged(); 
     recyclerView.smoothScrollToPosition(imAdapter.getItemCount()); 
    } 

    @Override 
    public void updateActivity() { 

     chatMsgList.clear(); 
     prepareChatData(); 
     recyclerView.smoothScrollToPosition(imAdapter.getItemCount()); 
    } 



    @Override 
    public void callActivityMethod() { 
     updateChatData(); 
    } 


    private String convertToDayDateTime(long timestamp){ 
     Calendar cal = Calendar.getInstance(); 
     TimeZone tz = cal.getTimeZone(); 
     SimpleDateFormat sdf = new SimpleDateFormat("EEE dd/MM/yyyy HH:mm"); 
     sdf.setTimeZone(tz); 
     String localTime = sdf.format(new Date(timestamp)); 

     return localTime; 
    } 

    private String getReceiptFromDelivered(int position){ 
     String receipt; 
     if (msgList.get(position).getDelivered().equals("0")){ 
      receipt = "..."; 
     }else { 
      receipt = "S"; 
     } 
     return receipt; 
    } 
} 

IMAdapter.java

 public class ImAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder> { 
     private List<ChatMsg> chatMsgList = new ArrayList<ChatMsg>(); 
     final int VIEW_TYPE_USER = 1; 
     final int VIEW_TYPE_OTHER = 0; 
     public ImAdapter(List<ChatMsg> chatMsgList){ 
     this.chatMsgList = chatMsgList; 
     } 

     @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType==VIEW_TYPE_USER){ 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_msg_user,parent,false); 
     return new ImUserViewHolder(itemView); 
     } 
    else { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_msg_other,parent,false); 
     return new ImOtherViewHolder(itemView); 
     } 
     } 

     @Override 
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (holder.getItemViewType()==VIEW_TYPE_USER){ 
     ChatMsg chatMsg = chatMsgList.get(position); 
     ImUserViewHolder imUserViewHolder = (ImUserViewHolder)holder; 
     imUserViewHolder.msg.setText(chatMsg.getMsg()); 
     imUserViewHolder.timeStamp.setText(chatMsg.getTime()); 
     } 
    else { 
     ChatMsg chatMsg = chatMsgList.get(position); 
     ImOtherViewHolder imOtherViewHolder = (ImOtherViewHolder) holder; 
     imOtherViewHolder.msg.setText(chatMsg.getMsg()); 
     imOtherViewHolder.timeStamp.setText(chatMsg.getTime()); 
     } 
     } 


     @Override 
     public int getItemViewType(int position) { 
     ChatMsg chatMsg = chatMsgList.get(position); 
     if (chatMsg.getOther().equals("true")){ 
     return VIEW_TYPE_OTHER; 
     } 
    else { 
     return VIEW_TYPE_USER; 
     } 
     } 

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

     public class ImOtherViewHolder extends RecyclerView.ViewHolder{ 
     public TextView msg; 
     public TextView timeStamp; 
     public ImOtherViewHolder(View itemView) { 
     super(itemView); 
     msg = (TextView)itemView.findViewById(R.id.tv_chat_msg_other); 
     timeStamp = (TextView)itemView.findViewById(R.id.tv_time_chat_msg_other); 
     } 
     } 

     public class ImUserViewHolder extends RecyclerView.ViewHolder{ 
     public TextView msg; 
     public TextView timeStamp; 
     public ImUserViewHolder(View itemView) { 
     super(itemView); 
     msg = (TextView)itemView.findViewById(R.id.tv_chat_msg_user); 
     timeStamp = (TextView)itemView.findViewById(R.id.tv_time_chat_msg_user); 
     } 
     } 


} 
+0

請,把你的代碼在這裏。 –

+0

發佈你迄今爲止所做的事情,看看你在哪裏。 –

+0

我在編輯中提供了代碼。請檢查。 –

回答

0

要你IMAdapter添加方法

public void setChatMsgList(List<ChatMsg> chatMsgList) { 
    this.chatMsgList = chatMsgList; 
} 

,並在方法你IMActivity prepareChatData把這種新的方法setChatMsgList

{ 
    ... 
    chatMsgList.add(chatMsg); 
} 
imAdapter.setChatMsgList(chatMsgList); 
imAdapter.notifyDataSetChanged(); 
+0

我試過了,但沒有奏效。 –

相關問題