Android сохраняет состояние элемента ListView, содержащего кнопку и текстовое поле при перезапуске приложения - PullRequest
0 голосов
/ 30 мая 2018

Этот вопрос может уже существовать в StackOverflow, но я не смог его найти, потому что не знал, как описать этот сценарий с точными формулировками, поэтому я подумал, что лучше задать новый вопрос и описать его здесь.

У меня есть ListView в моей основной деятельности.Каждый элемент в ListView содержит кнопку, которая видна по умолчанию, и текстовое поле, которое невидимо по умолчанию.Как только я нажму кнопку, она исчезнет, ​​и текстовое поле будет видно с сообщением - «Активировано currentUser».Кроме того, это сообщение будет храниться в базе данных.Это отдельно от события listitem onclick, как можно заметить из моего кода.

Проблема в том, что я не могу сохранить состояние элементов ListView, если я перезапускаю свое приложение.Предположим, у меня есть 4 элемента в моем ListView.Для 2 элементов я нажал только кнопку, и после этого кнопка исчезла, и на экране появилось текстовое поле с надписью «Активировано текущим пользователем».Однако, если я перезапущу свое приложение, кнопка появится снова, и текстовое поле исчезнет.

Приложение подключено к веб-приложению MEAN Stack, поэтому любая операция обновления или удаления повлияет на основное приложение MEAN Stack.

Вот мой код специального адаптера:

import com.elegantcab.getcabgo.utils.QueryUtils;

public class CabDriverNotificationAdapter extends ArrayAdapter<CabDriverNotification> {

private SessionManager mSession;
private String mNotificationId;
private String mMemo;
private static final String DATE_FORMAT = "LLL dd, yyyy";
private static final String TIME_FORMAT = "h:mm a";

public CabDriverNotificationAdapter(Context context, List<CabDriverNotification> notifications) {
    super(context, 0, notifications);

/** The static holder class will act as a holder for Android.Widget items
 * such as the activated by textview and the activate button **/
public static class ViewHolder{
    LinearLayout _layout;
    TextView _acceptedBy;
    Button acceptButton;
}

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

    View listItemView = convertView;
    final ViewHolder holder;
    mSession = new SessionManager(getContext());
    final CabDriverNotification currentNotification = getItem(position);
    // get the id of current notification
    mNotificationId = String.valueOf(currentNotification.getObjectId());

    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.notification_list_item, parent, false);
        holder = new ViewHolder();
        holder._layout = (LinearLayout) listItemView.findViewById(R.id.activate_layout);  
        holder._activatedBy = (TextView) listItemView.findViewById(R.id.activated_by_message); 
        holder.activateButton = (Button) listItemView.findViewById(R.id.activate_button);  
        listItemView.setTag(holder);

        //onClickListener for activate button
        holder.activateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mMemo = toggleActivaionStatus(holder, mNotificationId);
                QueryUtils.updateNotification(getContext(), new SessionManager(getContext()).getNotificationUrl(), mNotificationId, mMemo;
            }
        });

    }

    else {
        holder = (ViewHolder) listItemView.getTag();
        holder._activatedBy = (TextView) listItemView.findViewById(R.id.activated_by_message);
        holder.activateButton = (Button) listItemView.findViewById(R.id.activate_button);
        if(currentNotification.getMemo().contains("Activated by")){
            holder._activatedBy.setText(currentNotification.getMemo());
            holder._activatedBy.setVisibility(View.VISIBLE);
            holder.activateButton.setVisibility(View.GONE);
        }
        else{
            holder._activatedBy.setVisibility(View.GONE);
            holder.activateButton.setVisibility(View.VISIBLE);
            holder.activateButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mMemo = toggleActivateStatus(holder, mNotificationId);
                    QueryUtils.updateNotification(getContext(), new SessionManager(getContext()).getNotificationUrl(), mNotificationId, mMemo);
                }
            });
        }
    }

    // Create full name from first and last name
    String fullName = currentNotification.getFirstname() + " " + currentNotification.getLastname();
    // Find the TextView with view ID name
    TextView nameView = (TextView) listItemView.findViewById(R.id.name);
    // Display the name in that TextView
    nameView.setText(fullName);

    // Create a new Date object from the time in milliseconds of the notification
    Date dateObject = new Date(currentNotification.getTimeInMilliseconds());

    // Find the TextView with view ID date
    TextView dateView = (TextView) listItemView.findViewById(R.id.date);
    // Format the date string (i.e. "Mar 3, 1984")
    final String formattedDate = formatDate(dateObject);
    // Display the date of the current notification in that TextView
    dateView.setText(formattedDate);

    // Find the TextView with view ID time
    TextView timeView = (TextView) listItemView.findViewById(R.id.time);
    // Format the time string (i.e. "4:30PM")
    final String formattedTime = formatTime(dateObject);
    // Display the time of the current notification in that TextView
    timeView.setText(formattedTime);


    // attach a listener to the list item that will display the item detail when clicked
    listItemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Context context = v.getContext();
            Intent intent = new Intent(context, NotificationDetailActivity.class);
            intent.putExtra(NotificationDetailActivity.ARG_NOTIFICATION_ID, String.valueOf(currentNotification.getObjectId()));
            intent.putExtra(NotificationDetailActivity.ARG_NOTIFICATION_DATE, formattedDate);
            intent.putExtra(NotificationDetailActivity.ARG_NOTIFICATION_TIME, formattedTime);
            context.startActivity(intent);
        }
    });


    // Return the list item view that is now showing the appropriate data
    return listItemView;
}

private String toggleActivateStatus(ViewHolder vHolder, String nid){
        HashMap<String, String> currentUser = mSession.getUserDetails();
        String user = currentUser.get("username");
        String message = "Activated by" + " " + user;
        vHolder._activatedBy.setText(message);
        vHolder._activatedBy.setVisibility(View.VISIBLE);
        vHolder.activateButton.setVisibility(View.GONE);
        return message;
    }
}

Внутри onCreate основной активности:

 final ListView notificationListView = (ListView) findViewById(R.id.list);

 mAdapter = new CabDriverNotificationAdapter(this, new ArrayList<CabDriverNotification>());

 notificationListView.setAdapter(mAdapter);

Notification_list_item.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="@dimen/notification_activity_margin"
        android:layout_marginStart="@dimen/notification_activity_margin"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:fontFamily="sans-serif-medium"
            android:maxLines="1"
            android:textAllCaps="true"
            android:textColor="@color/textColorNotificationDetails"
            android:textSize="@dimen/notification_small_text_size"
            tools:text="@string/notification_item_name_default" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="@dimen/notification_activity_margin"
        android:orientation="vertical">

        <TextView
            android:id="@+id/date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:textColor="@color/textColorNotificationDetails"
            android:textSize="@dimen/notification_small_text_size"
            tools:text="@string/notification_detail_date_default" />

        <TextView
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:textColor="@color/textColorNotificationDetails"
            android:textSize="@dimen/notification_small_text_size"
            tools:text="@string/notification_detail_time_default" />

    </LinearLayout>

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/accept_layout"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/activated_by_message"
        android:textColor="@color/colorPrimary"
        android:text=""
        android:visibility="invisible"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/activate_button"
        android:layout_gravity="center_horizontal"
        android:text="Activate Driver"
        android:background="@color/colorAccent"/>

</LinearLayout>

Я хочу сохранить состояние моего элемента ListView после приложенияперезапустите, при этом, если я уже активировал два элемента, вместо кнопки должно отображаться текстовое поле с сообщением «Активировано currentUser».

1 Ответ

0 голосов
/ 30 мая 2018

Вы должны хранить данные где-то и загружать из этого хранилища.Например, вы можете использовать SQLite для него.Например, вы должны создать таблицу со столбцом ACTIVATED и сохранить в этом столбце состояние true или false для вашего элемента списка, а затем вам нужно загрузить эту информацию для всех элементов списка и установить видимость, полагаясь наих сохраненное значение.Или вы можете получить значения из API, например, если вы работаете с веб-сервисом.

РЕДАКТИРОВАТЬ:

Основная идея заключается в том, что вы сообщаете приложению - "Пожалуйста, создайте пустой listView (или т. Д.) ", Потому что Android не сохраняет состояние по умолчанию вашего приложения и ваших представлений, все они будут удалены после закрытия приложения.Более того, если вы измените ориентацию телефона, вы потеряете все данные ваших просмотров

...