Как автоматически обновить sh данных в recycleview android - PullRequest
1 голос
/ 23 апреля 2020

У меня есть представление рециркуляции, которое получает данные из таблицы sql, по сути, как приложение системы чата. но, конечно, мне нужно обновлять sh данные каждый раз, когда они меняются, однако я попытался использовать .notifyDataSetChanged (). но это, похоже, не работает для меня, может кто-нибудь помочь мне с этой задачей Согласно моему коду

вот мой код:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        getSupportActionBar().hide();
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);


        emojiButton = findViewById(R.id.emoji_button);
        submitButton = findViewById(R.id.submit_button);
        emojiconEditText = findViewById(R.id.emojicon_edit_text);
        emojIconActions = new EmojIconActions(getApplicationContext(),activity_chat,emojiButton,emojiconEditText);
        SyncData syncData = new SyncData();
        syncData.SyncoData("");
        syncData.execute();

        //emojIconActions.ShowEmojicon();


        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                try{
                    String editTextData = emojiconEditText.getText().toString();
                    SyncData orderdata = new SyncData();
                    orderdata.SyncData(editTextData);
                    Date c = Calendar.getInstance().getTime();
                    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
                    String formattedDate = df.format(c);
                    orderdata.SyncoData("Insert into CustomerSupportChat values('" + formattedDate + "','" + editTextData + "','Customer','3','" + getIntent().getStringExtra("nameid") + "','1','1') ");
                    orderdata.execute();
                    emojiconEditText.setText("");
                    emojiconEditText.requestFocus();
                }
                catch(Exception e) {
                    Log.e("ActivityName", "Exception caused by editText " + e.toString());
                }
            }
        });





        connectionClass = new ConnectionClass();
        itemArrayList = new ArrayList<ClassListChat>();
        listOfMessage = findViewById(R.id.list_of_message);

        MyAppAdapter appAdapter = new MyAppAdapter(itemArrayList,ChatActivity.this);
        listOfMessage.setAdapter(appAdapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ChatActivity.this);
        linearLayoutManager.setReverseLayout(true);
        listOfMessage.setLayoutManager(linearLayoutManager);

    }



    private class SyncData extends AsyncTask<String, String, String> {
        String msg;
        ProgressDialog progress;
        String editTextData;

        Date c = Calendar.getInstance().getTime();
        SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
        String formattedDate = df.format(c);



        public void SyncData(String editTextData) {
            this.editTextData = editTextData;
        }
        String inquery = "Insert into CustomerSupportChat values('" + formattedDate + "','" + editTextData + "','Customer','3','" + getIntent().getStringExtra("nameid") + "','1','1') ";

        public void SyncoData(String inquery) {
            this.inquery = inquery;
        }
        @Override
        protected void onPreExecute() //Starts the progress dailog
        {
            progress = ProgressDialog.show(ChatActivity.this, "Loading...",
                  "Please Wait...", true);
        }

        @Override
        protected String doInBackground(String... strings)  // Connect to the database, write query and add items to array list
        {

            runOnUiThread(new Runnable() {
                public void run() {


                    try {
                        Connection conn = connectionClass.CONN(); //Connection Object
                        if (conn == null) {
                            success = false;
                            msg = "Sorry something went wrong,Please check your internet connection";
                        } else {


                            // Change below query according to your own database.
                            Date c = Calendar.getInstance().getTime();
                            SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
                            String formattedDate = df.format(c);
                            System.out.println("it isssssssssssssssssssssssssssssssssssssssssaaaaaaaaaaaaaaaaaaaa" + formattedDate);


                            String query = inquery +
                                    "Select MessageID,MessageDate,MessageText,SenderType,MessageRecieved,MessageReaded,CustomerData.CustomerName,StoresData.StoreEnglishName,StoresData.StoreArabicName FROM " +
                                    "CustomerSupportChat INNER JOIN CustomerData ON " +
                                    "CustomerSupportChat.CustomerID = CustomerData.CustomerID INNER JOIN StoresData ON " +
                                    "CustomerSupportChat.StoreID = StoresData.StoreID ORDER BY MessageID DESC";
                           // String query2 =
                                  //  "Select MessageID,MessageDate,MessageText,SenderType,MessageRecieved,MessageReaded,Users_Login_Data.Username,StoresData.StoreEnglishName,StoresData.StoreArabicName FROM " +
                                    //        "CustomerSupportChat INNER JOIN Users_Login_Data ON " +
                                    //        "CustomerSupportChat.CustomerID = Users_Login_Data.CustomerID INNER JOIN StoresData ON " +
                                      //      "CustomerSupportChat.StoreID = StoresData.StoreID Where SenderType = 'Store' ORDER BY MessageID DESC";


                           //Statement stmt2 = conn.createStatement();


                           // ResultSet rs2 = stmt2.executeQuery(query2);
                            Statement stmt = conn.createStatement();
                            ResultSet rs = stmt.executeQuery(query);


                            itemArrayList.clear();

                                if (rs != null) // if resultset not null, I add items to itemArraylist using class created
                                {
                                    while (rs.next()) {

                                        try {
                                            itemArrayList.add(new ClassListChat(rs.getString("MessageText"), rs.getString("SenderType"), rs.getString("MessageText")));

                                        } catch (Exception ex) {
                                            ex.printStackTrace();
                                        }
                                    }

                                    msg = "Found";
                                    success = true;
                                } else {
                                    msg = "No Data found!";
                                    success = false;
                                }

                               // if ( rs2 != null){
                                //    while (rs2.next()){
                               //         itemArrayList.add(new ClassListChat("","Store",rs2.getString("MessageText")));
                               //     }
                              //  }



                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        Writer writer = new StringWriter();
                        e.printStackTrace(new PrintWriter(writer));
                        msg = writer.toString();
                        Log.d("Error", writer.toString());
                        success = false;
                    }

                }
            });
            return msg;
        }


        @Override
        protected void onPostExecute(String msg) // disimissing progress dialoge, showing error and setting up my listview
        {

            progress.dismiss();
            if (msg != null) {
                Toast.makeText(ChatActivity.this, msg + "", Toast.LENGTH_LONG).show();
            }

            if (!success) {
                Toast.makeText(ChatActivity.this,"ERROR " + msg,Toast.LENGTH_LONG).show();
            } else {
                try {
                    MyAppAdapter appAdapter = new MyAppAdapter(itemArrayList,ChatActivity.this);
                    listOfMessage.setAdapter(appAdapter);
                    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ChatActivity.this);
                    linearLayoutManager.setReverseLayout(true);
                    listOfMessage.setLayoutManager(linearLayoutManager);

                } catch (Exception ex) {

                }

            }
        }

    }



    public class MyAppAdapter extends RecyclerView.Adapter<MyAppAdapter.ViewHolder>//has a class viewholder which holds
    {
        private ArrayList<ClassListChat> mOriginalValues; // Original Values
        private ArrayList<ClassListChat> mDisplayedValues;

        public class ViewHolder extends RecyclerView.ViewHolder {

            TextView messageText;
            TextView messageStore;
            TextView messageUser;
            TextView messageTime;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                messageText = itemView.findViewById(R.id.message_text);
                messageUser = itemView.findViewById(R.id.message_user);
                messageTime = itemView.findViewById(R.id.message_time);
                messageStore = itemView.findViewById(R.id.message_text_store);
            }
        }

        public List <ClassListChat> parkingList;

        public Context context;
        ArrayList<ClassListChat> arraylist;


        private MyAppAdapter(List<ClassListChat> apps, Context context) {
            this.parkingList = apps;
            this.context = context;
            arraylist = new ArrayList<ClassListChat>();
            arraylist.addAll(parkingList);

        }



        @Override
        public MyAppAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
            View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listcontentstorechat,parent,false);
            ViewHolder viewHolder = new ViewHolder(rowView);

                LayoutInflater inflater = getLayoutInflater();
                rowView = inflater.inflate(R.layout.listcontentstorechat, parent, false);


            // here setting up names and images




            return viewHolder;
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {




            holder.messageUser.setText(parkingList.get(position).getMessageUser());
            holder.messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", parkingList.get(position).getMessageTime()));

            if (holder.messageUser.getText().toString().equals("Store")){
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                params.topMargin = 45;
                params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                holder.messageUser.setLayoutParams(params);
                holder.messageStore.setText(parkingList.get(position).getMessageOther());
            }else {

                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                params.topMargin = 2;
                params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                holder.messageUser.setLayoutParams(params);
                holder.messageText.setText(parkingList.get(position).getMessageText());
            }


            if (holder.messageText.getText().toString().equals("")){
                holder.messageText.setVisibility(View.GONE);
            }

            if (holder.messageStore.getText().toString().equals("")){
                holder.messageStore.setVisibility(View.GONE);
            }
            holder.setIsRecyclable(false);
            myAppAdapter.notifyDataSetChanged();
            System.out.println("COUNTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:"+myAppAdapter.getItemCount());

        }

        @Override
        public int getItemCount() {

                return arraylist.size();

            }

        }

Если вы заметили, что я уже добавил .notifyDataSetChanged () в последнюю строку onBindViewHolder (), но он возвращает ошибку в logcat, говоря, что getItemCount () является нулем, я также попытался поместить

if(arraylist != null){
    return arraylist.size();
}

но это тоже не работает. также оператор печати, который говорит, что «COUNTTT» ничего не печатает. любая помощь?!

...