Android在应用程序重启时保存包含按钮和文本框的ListView项的状态

Android在应用程序重启时保存包含按钮和文本框的ListView项的状态,android,listview,application-restart,Android,Listview,Application Restart,这个问题可能已经存在于StackOverflow中,但我无法找到它,因为我不确定如何用准确的措辞描述这个场景,因此我认为我应该提出一个新问题,并在这里描述它 我的主要活动中有一个列表视图。ListView上的每个项目都包含一个默认可见的按钮和一个默认不可见的文本框。一旦我点击按钮,它将消失,文本框将显示一条消息——“由currentUser激活”。此外,此消息将存储在数据库中。这与listitem onclick事件是分开的,从我的代码中可以看到这一点 问题是,如果重新启动应用程序,我将无法保留

这个问题可能已经存在于StackOverflow中,但我无法找到它,因为我不确定如何用准确的措辞描述这个场景,因此我认为我应该提出一个新问题,并在这里描述它

我的主要活动中有一个列表视图。ListView上的每个项目都包含一个默认可见的按钮和一个默认不可见的文本框。一旦我点击按钮,它将消失,文本框将显示一条消息——“由currentUser激活”。此外,此消息将存储在数据库中。这与listitem onclick事件是分开的,从我的代码中可以看到这一点

问题是,如果重新启动应用程序,我将无法保留ListView项目的状态。假设我的ListView中有4项。对于2个项目,我只单击了按钮,然后按钮消失,出现带有“由currentUser激活”的文本框。但是,如果我重新启动应用程序,按钮会再次出现,文本框也会消失

该应用程序连接到MEAN Stack web应用程序,因此任何更新或删除操作都将影响主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;
    }
}
导入com.elegantcab.getcabgo.utils.QueryUtils;
公共类CabDriverNotificationAdapter扩展了ArrayAdapter{
私人会话管理器会话;
私有字符串mNotificationId;
私有字符串mMemo;
私有静态最终字符串日期\格式=“LLL dd,yyyy”;
私有静态最终字符串时间\u FORMAT=“h:mm a”;
公共CabDriverNotificationAdapter(上下文、列表通知){
超级(上下文,0,通知);
/**静态holder类将充当Android.Widget项的holder
*例如,通过文本视图激活和激活按钮**/
公共静态类视图持有者{
线性布局_布局;
TextView _已被接受;
按钮接受按钮;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
View listItemView=convertView;
最终持票人;
mSession=newsessionmanager(getContext());
最终驾驶通知currentNotification=getItem(位置);
//获取当前通知的id
mNotificationId=String.valueOf(currentNotification.getObjectId());
如果(listItemView==null){
listItemView=LayoutFlater.from(getContext()).inflate(
R.layout.notification\u list\u项,父项,false);
holder=新的ViewHolder();
holder.\u layout=(LinearLayout)listItemView.findViewById(R.id.activate\u layout);
holder.\u activatedBy=(TextView)listItemView.findViewById(R.id.activated\u by\u消息);
holder.activateButton=(按钮)listItemView.findViewById(R.id.activate_按钮);
setTag(持有者);
//激活按钮的onClickListener
holder.activateButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mMemo=ToggleactivionStatus(持有人,通知ID);
QueryUtils.updateNotification(getContext()),new SessionManager(getContext()).getNotificationUrl(),mNotificationId,mMemo;
}
});
}
否则{
holder=(ViewHolder)listItemView.getTag();
holder.\u activatedBy=(TextView)listItemView.findViewById(R.id.activated\u by\u消息);
holder.activateButton=(按钮)listItemView.findViewById(R.id.activate_按钮);
if(currentNotification.getMemo()包含(“被激活者”)){
holder._activatedBy.setText(currentNotification.getMemo());
支架._由.setVisibility激活(View.VISIBLE);
holder.activateButton.setVisibility(视图已消失);
}
否则{
保持架._由.setVisibility激活(视图.消失);
holder.activateButton.setVisibility(视图可见);
holder.activateButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mMemo=TogleActivateStatus(持有人,mNotificationId);
updateNotification(getContext()、新会话管理器(getContext())、getNotificationUrl()、mNotificationId、mMemo);
}
});
}
}
//从名字和姓氏创建全名
字符串fullName=currentNotification.getFirstname()+“”+currentNotification.getLastname();
//查找具有视图ID名称的TextView
TextView名称视图=(TextView)listItemView.findViewById(R.id.name);
//在该文本视图中显示名称
nameView.setText(全名);
//从通知的时间(以毫秒为单位)创建新的日期对象
Date dateObject=新日期(currentNotification.getTimeInMillions());
//查找视图ID为date的TextView
TextView dateView=(TextView)listItemView.findViewById(R.id.date);
//格式化日期字符串(即“1984年3月3日”)
最终字符串formattedDate=FormattDate(dateObject);
//在该文本视图中显示当前通知的日期
dateView.setText(格式化日期);
//查找视图ID为time的TextView
TextView timeView=(TextView)listItemView.findViewById(R.id.time);
//格式化时间字符串(即“4:30PM”)
最终字符串formattedTime=FormattTime(dateObject);
//在该文本视图中显示当前通知的时间
timeView.setText(格式化时间);
//将侦听器附加到单击时将显示项目详细信息的列表项
listItemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Context=v.getContext();
意向意向=新意向(上下文、NotificationDetailActivity.class);
intent.putExtra(NotificationDetailActivity.ARG_NOTIFICATION_ID,String.valueOf(currentNotification)。
 final ListView notificationListView = (ListView) findViewById(R.id.list);

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

 notificationListView.setAdapter(mAdapter);
    <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>