0

I have adapter with 10 elements, when i use

listView.setAdapter(userAdapter);

Each elements in adapter is indicate multiple times, how to block this behaw? In each adapter i have http request

Fragment activity:

userAdapter = new UserModDevListCustomAdapter(getActivity(), R.layout.model_details_leg_list, userArray);
    listView = view.findViewById(R.id.f2_mod_list);
    listView.setItemsCanFocus(false);
    listView.setAdapter(userAdapter);

getView in adapter:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View row = convertView;
    UserHolder holder = null;

    mDatabaseHelper = new DatabaseHelper(context);
    preferences = getContext().getSharedPreferences("DevDetails", MODE_PRIVATE);
    preferencesLog = getContext().getSharedPreferences("Login", MODE_PRIVATE);
    restoreData();

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new UserHolder();
        holder.textName = row.findViewById(R.id.f2_listmod_name);
        holder.textValue = row.findViewById(R.id.f2_value_name);
        holder.textAddress = row.findViewById(R.id.f2_serialmod_name_edit);
        holder.btnEdit = row.findViewById(R.id.f2_btnmod_button);
        row.setTag(holder);
    } else {
        holder = (UserHolder) row.getTag();
    }
    final UserModDevList user = data.get(position);
    holder.textName.setText(user.getName());
    holder.textAddress.setText(user.getAddress());
    holder.textValue.setText(R.string.set_loading);
    final String devID = user.getUrl();

    if(mDatabaseHelper.getType(devID).equals("meter")){
        final UserHolder finalHolder = holder;
        String hosty4 = "http://" + shost + "/xxx/" + mDatabaseHelper.getValue(devID) + "?alt=json";
        AsyncHttpClient client = new AsyncHttpClient();
        client.addHeader("Cookie", stoken);
        client.get(hosty4, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {
                JSONObject response = null;
                try {
                    response = new JSONObject(new String(responseBody));
                    JSONObject table = response.getJSONObject("present-value");
                    JSONObject table2 = response.getJSONObject("units");
                    if(table.getString("value").isEmpty() && table2.getString("value").isEmpty()){
                        finalHolder.textValue.setText(R.string.set_db_update_err);
                    }else{
                        finalHolder.textValue.setText(table.getString("value") + "\n" + table2.getString("value"));
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {
                finalHolder.textValue.setText(R.string.set_db_update_err);
            }
        });
    }else{
        holder.textValue.setText("");
    }
    holder.btnEdit.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //some code
        }
    });
    return row;

}

This is my log from Android Studio:

E/MODEL: 10 - number of elements in array
D/skia: jpeg_decoder mode 1, colorType 4, w 552, h 828, sample 1, bsLength 0!!
E/NAZWA: ELE_003
E/NAZWA: ELE_002
E/NAZWA: ELE_000_1
E/NAZWA: ELE_000_2
E/NAZWA: ELE_001
E/NAZWA: ELE_004
E/NAZWA: ELE_005
E/NAZWA: ELE_006
E/NAZWA: GAS_000
E/NAZWA: ELE_000_3
E/NAZWA: ELE_003
E/NAZWA: ELE_002
E/NAZWA: ELE_000_1
E/NAZWA: ELE_000_2
E/NAZWA: ELE_001
E/NAZWA: ELE_004
E/NAZWA: ELE_005
E/NAZWA: ELE_006
E/NAZWA: GAS_000
W/libEGL: [ANDROID_RECORDABLE] format: 1
D/mali_winsys: new_window_surface returns 0x3000
E/NAZWA: ELE_003
E/NAZWA: ELE_002
E/NAZWA: ELE_000_1
E/NAZWA: ELE_000_2
E/NAZWA: ELE_001
E/NAZWA: ELE_004
E/NAZWA: ELE_005
E/NAZWA: ELE_006
E/NAZWA: GAS_000
E/NAZWA: ELE_003
E/NAZWA: ELE_002
E/NAZWA: ELE_000_1
E/NAZWA: ELE_000_2
E/NAZWA: ELE_001
E/NAZWA: ELE_004
E/NAZWA: ELE_005
E/NAZWA: ELE_006
E/NAZWA: GAS_000
I/[MALI][Gralloc]: [+]r_hnd(0x7f695153c0), client(41), share_fd(152)
I/[MALI][Gralloc]: [+]r_hnd(0x7f69518480), client(41), share_fd(155)
V/InputMethodManager: onWindowFocus: null softInputMode=272 first=true flags=#81810100
V/InputMethodManager: START INPUT: com.android.internal.policy.PhoneWindow$DecorView{2bf01ee V.E...... R.....ID 0,0-720,1280} ic=null tba=EditorInfo { packageName=pl.deltacontrols.ewebfmmobile, inputType=0x0, imeOptions=0x0, privateImeOptions=null } controlFlags=#104
D/FA: Connected to remote service
V/FA: Processing queued up service tasks: 4
D/SQLiteDatabase: beginTransaction()
D/SQLiteDatabase: endTransaction()
E/NAZWA: ELE_003
D/SQLiteDatabase: beginTransaction()
D/SQLiteDatabase: endTransaction()
E/NAZWA: ELE_002
E/NAZWA: ELE_000_1
E/NAZWA: ELE_000_2
E/NAZWA: ELE_001
E/NAZWA: ELE_004
E/NAZWA: ELE_005
E/NAZWA: ELE_006
E/NAZWA: GAS_000
E/NAZWA: ELE_000_3
E/NAZWA: ELE_003
E/NAZWA: ELE_002
E/NAZWA: ELE_000_1
E/NAZWA: ELE_000_2
E/NAZWA: ELE_001
E/NAZWA: ELE_004
E/NAZWA: ELE_005
E/NAZWA: ELE_006
E/NAZWA: GAS_000

The main problem is the app starting lagging when load value multiple times from request

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
  • 1
    The main problem is that in Adapter you do not only preparation your data to representation in ListView. Don't use ListView - it's almost 2020. Use RecyclerView. Prepare your data before put them in Adapter. Also do it in onCreate method to avoid dublication. – Eugene Troyanskii Dec 23 '19 at 13:28
  • don't load you data in `getView()` check [this](https://stackoverflow.com/questions/7088738/when-is-the-getview-method-of-listview-called/7088758) you can load your data in your `activity` or `fragment` then pass the data to the `adapter` – Mohammed Alaa Dec 23 '19 at 13:36

0 Answers0