Использование счетчика в приложении для Android. Я устанавливаю адаптер и заполняю его данными из базы данных.

Проблема в том, что каждый раз, когда я касаюсь за пределами счетчика (например, EditText), макет элемента счетчика исчезает на секунду и только потом появляется снова.
Кажется, счетчик обновляется каждый раз.

Я заполняю счетчик только один раз в методе onCreate() Activity:

 List<Deal> listDeals = mDealDao.getLastActiveDeals();
    if (listDeals != null) {
        mAdapter = new SpinnerDealsAdapter(this, listDeals);
        mSpinnerDeal.setAdapter(mAdapter);
        mSpinnerDeal.setOnItemSelectedListener(this);
    }

Вот адаптер:

public class SpinnerDealsAdapter extends BaseAdapter {

    public static final String TAG = "SpinnerDealsAdapter";

    private List<Deal> mItems;
    private LayoutInflater mInflater;

    public SpinnerDealsAdapter(Context context, List<Deal> listCompanies) {
        this.setItems(listCompanies);
        this.mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return (getItems() != null && !getItems().isEmpty()) ? getItems().size() : 0 ;
    }

    @Override
    public Deal getItem(int position) {
        return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position) : null ;
    }

    @Override
    public long getItemId(int position) {
        return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position).getId() : position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        ViewHolder holder;
        if(v == null) {
            v = mInflater.inflate(R.layout.spinner_item_deal, parent, false);
            holder = new ViewHolder();
            holder.txtDealNumber = (TextView) v.findViewById(R.id.tv_deal_number);
            holder.txtDealName = (TextView) v.findViewById(R.id.txt_client_name);
            holder.txtProduct = (TextView) v.findViewById(R.id.txt_product);
            v.setTag(holder);
        }
        else {
            holder = (ViewHolder) v.getTag();
        }

        // fill row data
        Deal currentItem = getItem(position);
        if(currentItem != null) {
            holder.txtDealNumber.setText(String.valueOf(currentItem.getId()));
            holder.txtDealName.setText(currentItem.getClientName());
            holder.txtProduct.setText(currentItem.getProduct());
        }

        return v;
    }

    public List<Deal> getItems() {
        return mItems;
    }

    public void setItems(List<Deal> mItems) {
        this.mItems = mItems;
    }

    class ViewHolder {
        TextView txtDealNumber;
        TextView txtDealName;
        TextView txtProduct;
    }
}

ОБНОВЛЕНИЕ: вот как я получаю данные из базы данных:

public List<Deal> getLastActiveDeals() {
        List<Deal> listDeals = new ArrayList<Deal>();

        Cursor cursor = mDatabase.query(DBHelper.TABLE_DEALS, mAllColumns,
                DBHelper.COLUMN_DEAL_IS_COMPLETED_FLAG + " = ?",
                new String[] { "0" }, null, null, DBHelper.COLUMN_DEAL_ID + " DESC");
        if (cursor != null) {
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                Deal deal = cursorToDeal(cursor);
                listDeals.add(deal);
                cursor.moveToNext();
            }

            // closing the cursor
            cursor.close();
        }
        return listDeals;

Макет деятельности:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aandroid="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:layout_marginRight="@dimen/activity_horizontal_margin">


        <android.support.design.widget.TextInputLayout
            android:id="@+id/txt_contactor_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:textColorHint="@color/text_hint_color">


            <AutoCompleteTextView
                android:id="@+id/txt_contactor"
                style="@style/EditTextStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="6dp"
                android:hint="@string/contractor"
                android:inputType="text" />

        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/txt_expense_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/txt_contactor_layout"
            android:textColorHint="@color/text_hint_color">


            <AutoCompleteTextView
                android:id="@+id/txt_expense"
                style="@style/EditTextStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="6dp"
                android:hint="@string/expense"
                android:inputType="numberDecimal" />


        </android.support.design.widget.TextInputLayout>


        <TextView
            android:id="@+id/tv_active_deals_spinner_description"
            style="@style/DescriptionTextStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/txt_expense_layout"
            android:layout_marginTop="15dp"
            android:layout_marginBottom="@dimen/descriptions_vertical_margin"
            android:text="@string/active_deals_spinner_description" />

        <LinearLayout
            android:id="@+id/ll_spinner_deals"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tv_active_deals_spinner_description"
            android:background="@drawable/bg_white_accent_stroke_round">


        <Spinner
            android:id="@+id/spinner_deals"
            style="@style/EditTextStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:animateLayoutChanges="true"
            android:prompt="@string/select_a_deal"
            android:spinnerMode="dropdown" />
        </LinearLayout>

        <Button
            android:id="@+id/btn_add_quick_expense"
            style="@style/ButtonStyle"
            android:layout_width="match_parent"
            android:layout_height="@dimen/button_height"
            android:layout_below="@+id/ll_spinner_deals"
            android:layout_marginTop="12dp"
            android:gravity="center"
            android:onClick="onClick"
            android:paddingBottom="2dp"
            android:paddingLeft="12dp"
            android:paddingRight="12dp"
            android:paddingTop="2dp"
            android:text="@string/add_new_expense" />

        <TextView
            android:id="@+id/tv_quick_add_expense_no_active_deals"
            style="@style/DescriptionTextStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/txt_expense_layout"
            android:gravity="center"
            android:text="@string/no_active_deals"
            android:textColor="@color/accent"
            android:visibility="gone" />

        <Button
            android:id="@+id/btn_add_quick_expense_add_deal"
            style="@style/ButtonStyle"
            android:layout_width="match_parent"
            android:layout_height="@dimen/button_height"
            android:layout_below="@+id/tv_quick_add_expense_no_active_deals"
            android:layout_marginTop="15dp"
            android:gravity="center"
            android:onClick="onClick"
            android:paddingBottom="2dp"
            android:paddingLeft="12dp"
            android:paddingRight="12dp"
            android:paddingTop="2dp"
            android:text="@string/add_new_deal"
            android:visibility="gone" />
    </RelativeLayout>

</ScrollView>

Что не так?

1
Androider 30 Дек 2015 в 16:34

2 ответа

Лучший ответ

Наконец-то нашел решение.
Проблема заключалась в макете действия.
Я только что удалил android:animateLayoutChanges="true" со счетчика, и отставание исчезло.

0
Androider 31 Дек 2015 в 01:18

Вы каждый раз создаете новый адаптер.

Вместо того:

 List<Deal> listDeals = mDealDao.getLastActiveDeals();
    if (listDeals != null) {
        mAdapter = new SpinnerDealsAdapter(this, listDeals);
        mSpinnerDeal.setAdapter(mAdapter);
        mSpinnerDeal.setOnItemSelectedListener(this);
    }

Сделай это:

//Only do this once in onCreate or something
List<Deal> listDeals = mDealDao.getLastActiveDeals();

SpinnerDealsAdapter mAdapter;
//mAdapter should be a field in the activity

if (mAdapter == null) {
    mAdapter = new SpinnerDealsAdapter(this, listDeals);
    mSpinnerDeal.setAdapter(mAdapter);
    mSpinnerDeal.setOnItemSelectedListener(this);
}
else 
    mSpinnerDeal.setAdapter(mAdapter);
0
Arnold Balliu 30 Дек 2015 в 18:51