-2

I think ive looked at almost all threads wont seem to work. Ive got a chat and im trying to update the list view every second im doing it on another thread however, im using runOnUiThread though it still wont update im logging the return and it seems there is a return every second with the correct data. The code

protected void onCreate(Bundle savedInstanceState) {
    ........

    lv = (ListView) findViewById(R.id.message_array);

    returnFunc = "messages";

    messages();
    send = (ImageButton) findViewById(R.id.sendMessage);

    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            returnFunc = "btnSend";
            message = (EditText) findViewById(R.id.messageEditText);
            message_input = message.getText().toString();
            sendMessage();
        }
    });
    new Thread(new Runnable() {
        @Override
        public void run() {
            boolean test = true;

            while (test) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                }
                messages();

            }



        }
    }).start();


}



 public static Handler handler = new Handler();
public void messageLoop(){
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    messages();
                    handler.postDelayed(this,1000);

                }
            });
        }
    },1000);
}

the messages function which gets the data fine

public void messages() {
    String urlParameters = String.format("%s", "chatid="+tempVars.chatID+"&token="+tempVars.token);
    new AsyncHttpPost(this).execute("http://mylink.com/appAccess.php?action=messages&", urlParameters);

}



public void getMessages(String content){
    myList = new ArrayList<Messages>();

    int index = lv.getFirstVisiblePosition();
    View v = lv.getChildAt(0);
    int top = (v == null) ? 0 : (v.getTop() - lv.getPaddingTop());


    try{
        JSONArray jsonarray = new JSONArray(content);
        for (int i = 0; i < jsonarray.length(); i++) {
            JSONObject jsonobject = jsonarray.getJSONObject(i);
            boolean mine;
            if(jsonobject.getString("isMine").equals("true")){
                mine = true;
            }else{
                mine = false;
            }

            myList.add(new Messages(jsonobject.getString("message"),jsonobject.getString("timestamp"),jsonobject.getString("name"),mine,jsonobject.getString("id")));
        }

    }catch (Throwable tx){

    }

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3)
        {
            Messages CurrentMessage = myList.get(position);
            tempVars.messageID = CurrentMessage.getID();
            //startActivity(new Intent("PersonalChat"));
        }
    });

    if(arrayAdapter == null){
        arrayAdapter = new CustomAdapter(this, myList);
    }
    lv = (ListView) findViewById(R.id.message_array);
    lv.setAdapter(arrayAdapter);

    arrayAdapter.notifyDataSetChanged();

    if(firstView == 0){
        firstView = 1;
        lv.setSelection(arrayAdapter.getCount() - 1);
    }else{
        lv.setSelectionFromTop(index, top);
    }

}

class CustomAdapter

   public class CustomAdapter extends ArrayAdapter<Messages>{
    Messages currentMessage;
    public CustomAdapter(Context context,  ArrayList<Messages> messages){
        super(context,R.layout.received_message, messages);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View itemView = convertView;

        currentMessage = myList.get(position);
        setTitle(currentMessage.getName());


        if(currentMessage.isMine()){
            itemView = getLayoutInflater().inflate(R.layout.sent_message,parent, false);

            TextView message = (TextView) itemView.findViewById(R.id.message);
            message.setText(currentMessage.getMessage());

            TextView timestamp = (TextView) itemView.findViewById(R.id.date);
            timestamp.setText(currentMessage.getTimestamp());
        }else{
            itemView = getLayoutInflater().inflate(R.layout.received_message,parent, false);

            TextView message = (TextView) itemView.findViewById(R.id.message_text);
            message.setText(currentMessage.getMessage());

            TextView timestamp = (TextView) itemView.findViewById(R.id.timestamp);
            timestamp.setText(currentMessage.getTimestamp());
        }

        return itemView;
    }
}

Thanks in advance

More info

When i call the message function originally in onCreate it works fine

2 Answers2

0
 new Thread(new Runnable() {
        @Override
        public void run() {
            boolean test = true;

             while (test) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                }mymessage();

            }



        }
    }).start();
Mohit Madaan
  • 469
  • 2
  • 11
0

Replace your getMessages() method with below code:

public void getMessages(String content){
myList = new ArrayList<Messages>();

int index = lv.getFirstVisiblePosition();
View v = lv.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - lv.getPaddingTop());


try{
    JSONArray jsonarray = new JSONArray(content);
    for (int i = 0; i < jsonarray.length(); i++) {
        JSONObject jsonobject = jsonarray.getJSONObject(i);
        boolean mine;
        if(jsonobject.getString("isMine").equals("true")){
            mine = true;
        }else{
            mine = false;
        }

        myList.add(new Messages(jsonobject.getString("message"),jsonobject.getString("timestamp"),jsonobject.getString("name"),mine,jsonobject.getString("id")));
    }

    arrayAdapter.notifyDataSetChanged();

}catch (Throwable tx){

}

lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3)
    {
        Messages CurrentMessage = myList.get(position);
        tempVars.messageID = CurrentMessage.getID();
        //startActivity(new Intent("PersonalChat"));
    }
});

if(arrayAdapter == null){
    arrayAdapter = new CustomAdapter(this, myList);
}
lv = (ListView) findViewById(R.id.message_array);
lv.setAdapter(arrayAdapter);


if(firstView == 0){
    firstView = 1;
    lv.setSelection(arrayAdapter.getCount() - 1);
}else{
    lv.setSelectionFromTop(index, top);
}

}
Dhruvi
  • 1,971
  • 2
  • 10
  • 18
  • do u have anything i can contact you on directly – Josh Mitch Jul 01 '16 at 11:13
  • however final Handler handler = new Handler() handler.postDelayed( new Runnable() { @Override public void run() { chas(); handler.postDelayed( this, 1000 ); } }, 1000 ); works on my get recent chats it updates lv fine its basically the same code – Josh Mitch Jul 01 '16 at 13:18