Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Java Мобильная разработка (Android)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2016, 19:37   #1
sergei0194
Новичок
Джуниор
 
Регистрация: 22.10.2016
Сообщений: 17
Восклицание setData() - выводит повторные значения

Здравствуйте. Подскажите пожалуйста что я делаю не так? У меня адаптер принимает данные с сервера и помещает их в листвью. Затем, когда поступают новые данные, я пытаюсь обновить адаптер...и как бы всё хорошо, но.. Когда приходят новые данные, например 2 сообщения, они добавляются в адаптер. Но вместе с новыми данными, добавляются и все остальные старые данные..Хотя по логам вижу что старых данных, поступивших с сервера у меня нет. Выходит что не выполняю data.clear(). Выполняю...data.clear(), мой листвью становится абсолютно пустым до следующего запроса Handler.postDelayed();. Снова запрос - листвью полный и с новыми данными...5 сек проходит и мой лист опять чистый...и так постоянно. Как это перебороть?
Код:
public class ChatMsgAdapter extends ArrayAdapter<ResponseMsgArray> {

private Context context;
private ArrayList<ResponseMsgArray> data;


protected String LV_KEY = Auth.key;
protected int LV_USID = Integer.parseInt(Auth.id);
protected int GET_ID = Integer.parseInt(FriendActivity.get_id);


String LOG_TAG = "FriendLOG";

public ChatMsgAdapter(Context context, ArrayList<ResponseMsgArray> values) {
    super(context,R.layout.activity_friend_msg, values);

    this.data = values;
    this.context = context;
}

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

    LayoutInflater inflater = LayoutInflater.from(context);

    View v;
    int type = getItemViewType(position);

    if(type == LV_USID) {
        v = inflater.inflate(R.layout.activity_friend_msg_adapter, null);

        TextView user_id_msg = (TextView) v.findViewById(R.id.id_msg);
        TextView user_text = (TextView) v.findViewById(R.id.msg);
        TextView user_date = (TextView) v.findViewById(R.id.msg_time);

        user_text.setText(data.get(position).getMsg());
        user_date.setText(data.get(position).getMsg_time());
        user_id_msg.setText(data.get(position).getMsg_id());

    } else if (type == GET_ID) {
        v = inflater.inflate(R.layout.talker, null);

        TextView talker_text = (TextView) v.findViewById(R.id.msg);
        TextView talker_date = (TextView) v.findViewById(R.id.msg_time);
        talker_text.setText(data.get(position).getMsg());
        talker_date.setText(data.get(position).getMsg_time());

    } else {
        //Если нет например сообщений
        v = inflater.inflate(R.layout.msg_null, null);
    }

    return v;
}

public void setData(ArrayList<ResponseMsgArray> newData) {
    addAll(newData);
    notifyDataSetChanged();
}


@Override
public int getItemViewType(int position) {

    int newPosition = Integer.parseInt(data.get(position).getMsg_id_us());
    return newPosition;
}
}
sergei0194 вне форума Ответить с цитированием
Старый 22.10.2016, 20:23   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

А остольной код можно посмотреть ? Ато так не понятно когда и где идет вызов некоторыез методов !
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 22.10.2016, 21:08   #3
sergei0194
Новичок
Джуниор
 
Регистрация: 22.10.2016
Сообщений: 17
Восклицание

Вот обработка JSON
Код:
public class ResponseMsgJson {

    String LOG_TAG = "FriendLOG";

    public ArrayList<ResponseMsgArray> parseData(String response) {

        ArrayList<ResponseMsgArray> data = new ArrayList<>();
        JSONObject dataJsonObj = null;

        try {
            dataJsonObj = new JSONObject(response);
            JSONArray chat = dataJsonObj.getJSONArray("data");

            for (int i = 0; i < chat.length(); i++) {
                ResponseMsgArray rms = new ResponseMsgArray();

                JSONObject msgList = chat.getJSONObject(i);
                String error = msgList.getString("error");

                String msg;
                String msg_id;
                String msg_time;
                String msg_id_us;
                String msg_end_id;

                if (!error.equals("0")) {

                    if (error.equals("1")) {
                        Log.d(LOG_TAG, "Ошибка 1!..");
                    }
                    if (error.equals("2")) {
                        Log.d(LOG_TAG, "Ошибка 2!..");
                    }
                    if (error.equals("3")) {
                        Log.d(LOG_TAG, "Новых сообщений нет!..");
                    }

                } else {

                    msg = msgList.getString("msg");
                    msg_id = msgList.getString("msg_id");
                    msg_time = msgList.getString("msg_time");
                    msg_id_us = msgList.getString("msg_id_user");
                    msg_end_id = msgList.getString("endMsg");

                    rms.setMsg(msg);
                    rms.setMsg_id(msg_id);
                    rms.setMsg_time(msg_time);
                    rms.setMsg_id_us(msg_id_us);
                    data.add(rms);
                    Log.d(LOG_TAG, "success..");
                }

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return data;
    }
}
Тут у меня сам запрос
Код:
public class UpdateMsg extends AsyncTask<ArrayList<ResponseMsgArray>, Void, ArrayList<ResponseMsgArray>> {

    String LOG_TAG = "FriendLOG";

    protected String LV_KEY = Auth.key;
    protected int LV_USID = Integer.parseInt(Auth.id);
    protected int GET_ID = Integer.parseInt(FriendActivity.get_id);

    private ResponseCallback callback;
    private String EndMsgId;

    public UpdateMsg(ResponseCallback callback, String EndMsgId) {
        this.callback = callback;
        this.EndMsgId = EndMsgId;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected ArrayList<ResponseMsgArray> doInBackground(ArrayList<ResponseMsgArray>... params) {

        StringBuilder content = new StringBuilder();

        byte[] data = null;
        String parammetrs = "FriendMsgLoad=true&get_id=" + GET_ID + "&us_id=" + LV_USID + "&end_msg=" + EndMsgId + "&key=" + LV_KEY;

        Log.d(LOG_TAG, parammetrs);

        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL("http://мойсайтточкаруиндексточкаphp");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(5000);
            urlConnection.setReadTimeout(5000);
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);

            urlConnection.setRequestProperty("Content-Length", "" + Integer.toString(parammetrs.getBytes().length));
            OutputStream os = urlConnection.getOutputStream();
            data = parammetrs.getBytes("UTF-8");
            os.write(data);
            urlConnection.connect();

            InputStream inputStream = urlConnection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line + "\n");
            }

            if (content.length() == 0) {
                return null;
            }

            return new ResponseMsgJson().parseData(content.toString());

        } catch (IOException e) {
            Log.d("PlaceholderFragment", "Error ", e);
            return null;
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
    }

    protected void onPostExecute(ArrayList<ResponseMsgArray> result) {
        callback.response(result);
    }
}
Геттеры и сеттеры
Код:
public class ResponseMsgArray {

    private String msg;
    private String msg_id;
    private String msg_time;
    private String msg_id_us;
    private String newMsg = "1";

    //************************ getters ******************************************

    public String getMsg() {
        return msg;
    }

    public String getNewMsg() {
        return newMsg;
    }

    public String getMsg_id() {
        return msg_id;
    }

    public String getMsg_time() {
        return msg_time;
    }

    public String getMsg_id_us() {
        return msg_id_us;
    }

    //*************************** setters *****************************************

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public void setNewMsg(String msg) {
        this.newMsg = newMsg;
    }

    public void setMsg_id(String msg) {
        this.msg_id = msg;
    }

    public void setMsg_time(String msg) {
        this.msg_time = msg;
    }

    public void setMsg_id_us(String msg) {
        this.msg_id_us = msg;
    }
}
Ну и сам интерфейс:
Код:
public interface ResponseCallback {
    void response(ArrayList<ResponseMsgArray> response);
}

Последний раз редактировалось sergei0194; 22.10.2016 в 21:16.
sergei0194 вне форума Ответить с цитированием
Старый 22.10.2016, 21:09   #4
sergei0194
Новичок
Джуниор
 
Регистрация: 22.10.2016
Сообщений: 17
По умолчанию

А вот и код моей активности
Код:
public class FriendMsgActivity extends AppCompatActivity implements ResponseCallback {

    private ListView listView;
    String LOG_TAG = "FriendLOG";

    ArrayList data;
    EditText editText;
    Handler mHandler;

    ChatMsgAdapter sAdapter;

    public static String getEndMsgId = "0";
    protected String LV_KEY = Auth.key;
    protected int LV_USID = Integer.parseInt(Auth.id);
    protected int GET_ID = Integer.parseInt(FriendActivity.get_id);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_friend_msg);
        setTitle(get_login);

        listView = (ListView) findViewById(R.id.lvFriendMsg);
        editText = (EditText) findViewById(R.id.form_input);
    }

    @Override
    public void response(ArrayList<ResponseMsgArray> response) {
            if(sAdapter == null) {
                sAdapter = new ChatMsgAdapter(this, response);
                listView.setAdapter(sAdapter);
                Log.d(LOG_TAG, "Array:: setAdapter");
            } else {
                sAdapter.setData(response);
                Log.d(LOG_TAG, "Array:: setData");
            }
    }

    class RefreshActivity extends Thread {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mHandler.postDelayed(this, 5000);
                    UpdateMsg updateMsg = new UpdateMsg(FriendMsgActivity.this, getEndMsgId);
                    updateMsg.execute();
                }
            });
        }
    }

    public void sendMsg(View v) {

        editText = (EditText) findViewById(R.id.form_input);
        String form_input_msg = editText.getText().toString();

        if (!form_input_msg.equals("")) {
            GetMsg getMsg = new GetMsg();
            getMsg.SendMsg(getApplicationContext(), GET_ID, form_input_msg);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();

        mHandler = new Handler();
        mHandler.post(new RefreshActivity());
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        Log.d(LOG_TAG, "MainActivity: onStart()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        getEndMsgId = "0";
        mHandler.removeCallbacksAndMessages(null);
        Log.d(LOG_TAG, "MainActivity: onDestroy()");
    }


}
sergei0194 вне форума Ответить с цитированием
Старый 22.10.2016, 21:39   #5
sergei0194
Новичок
Джуниор
 
Регистрация: 22.10.2016
Сообщений: 17
По умолчанию

pompiduskus, у вас есть идеи? Скрипт работает ПОЧТИ как надо, всё прекрасно добавляет и обновляет. Но вот только почему он копирует предыдущие сообщения с теми же ID, NAME, MESSAGE? Была идея перебрать ArrayList<...> и если есть одинаковые ID, то их удалить. Но мне кажется что это всего на всего костыль, который ни как не канает использовать)
sergei0194 вне форума Ответить с цитированием
Старый 22.10.2016, 22:26   #6
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Не погу сказать со 100% уверенностью, но скорее всего так происходит вот из за этого куска кода

// Тут не понятно как отрабатывает метод addAll();
Код:

    public void setData(ArrayList<ResponseMsgArray> newData) {
        addAll(newData);
        notifyDataSetChanged();
    }

Я сам делаю все в ручную. вот так, это реальный кусок кода, дак что не обращай внимание на мусор

Код:
public void updateDBList() {

    // -------------------------------------------------------
    try {

        // mArrList == ArrayList<String>
        mArrList.clear();

        String[] tmp = databaseList();

        for (int i=0; i<tmp.length; i++ ) {

            if (tmp[i].endsWith("-journal"))
                continue;

            mArrList.add(tmp[i].split(".db")[0]);

        }

        // mAdapter == ArrayAdapter<String>
        mAdapter.notifyDataSetChanged();

    } catch (Exception e) {

        String err_msg = " updateDBList: "+e.toString();

        if ( SHOW_ERRORS_ON_TOAST ) ToastShort( err_msg );
        if ( SHOW_ERRORS_ON_STATUSBAR ) toStatusBar( err_msg );

        LOG( err_msg );

    }
    // -------------------------------------------------------
}
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 22.10.2016, 22:43   #7
sergei0194
Новичок
Джуниор
 
Регистрация: 22.10.2016
Сообщений: 17
По умолчанию

Верно сказано `addAll(newData);`, всё дело в этой строке. Если убрать данный метод, то новые данные не отображаются. Из твоего куска кода я так понимаю что ты перебераешь старые данные? Дело в том что с использованием метода data.clear(), мои данные стираются полностью с листа, а через 5 сек снова появляются и старые и новые. Ну дело ясное почему "if(sAdapter == null)....else...". Выходит что всё-таки будет лучше перебирать массив, находить идентичные ID, и удалять их?
sergei0194 вне форума Ответить с цитированием
Старый 22.10.2016, 23:01   #8
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Тяжело так сказать.
Просто когда перебираешь в "ручную" все данные, то есть некий доп. контроль что-ли. Не могу подобрать слова.

Попробуй, сделать так-как ты и сказал. Перебирай все данные, фильтруй, убирай дубликаты.
И если это поможет, то хотя-бы будешь знать что проблема была именно в этом.

Так как еще не факт что это будет именно так.

Отпишись пожалуйсто, как будет продвижение. Мне интересно что там нет так шло.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 22.10.2016, 23:26   #9
sergei0194
Новичок
Джуниор
 
Регистрация: 22.10.2016
Сообщений: 17
По умолчанию

Всё ясно, пошёл я за бубном да разжигать костёр По результатам обязательно отпишусь
sergei0194 вне форума Ответить с цитированием
Старый 23.10.2016, 00:03   #10
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Код:
public void setData(ArrayList<ResponseMsgArray> newData) {
    clear();
    addAll(newData);
    notifyDataSetChanged();
}
Попробуй так.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
значения массива считывается с файла, а повторные элементы этого массива выводятся во 2 файл C++ carrie bradshaw Помощь студентам 5 03.02.2014 09:13
записать в файл массив, а в другой файл вывести повторные значения элементов массива С++ carrie bradshaw Помощь студентам 3 01.02.2014 23:27
Не выводит значения Rglore Microsoft Office Excel 9 09.11.2012 10:19
QT: QSqlQueryModel::setData() driims Qt и кроссплатформенное программирование С/С++ 0 02.06.2009 14:48
Не выводит значения из базы данных Linel PHP 13 26.02.2009 12:47