Android onLongItemClick影响回收视图

Android onLongItemClick影响回收视图,android,android-listview,Android,Android Listview,我有一个从arrayList加载项目的列表视图,当使用onLongClickItemListener 每当长时间单击某个项目时,我都会在该项目中显示隐藏的布局。因此,每当列表正在回收项目时,对于回收的项目(应该不显示布局),隐藏的布局将是可见的 有什么想法吗?我曾尝试在列表中的每个项目的对象本身添加一个标志,但运气不好,我能得到的最多的结果是使滚动时显示的每个项目的布局消失,但我想让用户打开的项目保持可见 以下是我当前的代码: messageListView.setOnItemLongClic

我有一个从arrayList加载项目的列表视图,当使用
onLongClickItemListener
每当长时间单击某个项目时,我都会在该项目中显示隐藏的布局。因此,每当列表正在回收项目时,对于回收的项目(应该不显示布局),隐藏的布局将是可见的

有什么想法吗?我曾尝试在列表中的每个项目的对象本身添加一个标志,但运气不好,我能得到的最多的结果是使滚动时显示的每个项目的布局消失,但我想让用户打开的项目保持可见

以下是我当前的代码:

 messageListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                LinearLayout ll = (LinearLayout) view.findViewById(R.id.hiddenLayout);
                if (ll.getVisibility() == View.VISIBLE) {
                    ll.setVisibility(View.GONE);
                    msgs.get(position).setViewFlag(false);
                    msgAdapter.setMessages(msgs);
                } else {
                    ll.setVisibility(View.VISIBLE);
                    msgs.get(position).setViewFlag(true);
                    msgAdapter.setMessages(msgs);
                }
                return true;
            }
        });
messageListView.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
LinearLayout ll=(LinearLayout)view.findViewById(R.id.hiddenLayout);
if(ll.getVisibility()==View.VISIBLE){
ll.setVisibility(View.GONE);
msgs.get(位置).setViewFlag(假);
msgAdapter.setMessages(msgs);
}否则{
ll.setVisibility(View.VISIBLE);
msgs.get(位置).setViewFlag(真);
msgAdapter.setMessages(msgs);
}
返回true;
}
});
下面是适配器的代码:

 public class MessagesAdapter extends BaseAdapter {

        private static int lastPos = -1;
        private ArrayList<Message> messages;
        private Context context;



    public MessagesAdapter(ArrayList<Message> messages, Context context) {
        this.messages = messages;
        this.context = context;
    }

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

        if (convertView == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            convertView = inflater.inflate(R.layout.message_list_row, null);

            ViewHolder viewHolder = new ViewHolder();

            viewHolder.title = (TextView) convertView.findViewById(R.id.msgTitle);
            viewHolder.body = (TextView) convertView.findViewById(R.id.msgBody);
            viewHolder.monthDate = (TextView) convertView.findViewById(R.id.monthDate);
            viewHolder.dayDate = (TextView) convertView.findViewById(R.id.dayDate);
            viewHolder.status = (ImageView) convertView.findViewById(R.id.statusIcon);
            viewHolder.linearLayout = (LinearLayout) convertView.findViewById(R.id.hiddenLayout);
            viewHolder.linearLayout.setVisibility(View.GONE);

            convertView.setTag(viewHolder);
        }

        ViewHolder holder = (ViewHolder) convertView.getTag();

        if (!(messages.get(position).isViewFlag()))
            holder.linearLayout.setVisibility(View.GONE);

        holder.title.setText(messages.get(position).getTitle());
        holder.body.setText(messages.get(position).getBody());
        switch (messages.get(position).getMessageType()) {
            case READ:
                holder.status.setBackgroundResource(R.drawable.yellowcircle);
                break;
            case UNREAD:
                holder.status.setBackgroundResource(R.drawable.redcircle);
                break;
        }
        lastPos = position;
        return convertView;
    }

    @Override
    public int getCount() {
        return messages.size();
    }

    @Override
    public Object getItem(int position) {
        return messages.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    static class ViewHolder {
        public TextView title;
        public TextView body;
        public TextView dayDate;
        public TextView monthDate;
        public ImageView status;
        public TextView read;
        public TextView unread;
        public TextView remove;
        public TextView reply;
        public LinearLayout linearLayout;

    }

    public void setMessages(ArrayList<Message> msgs) {
        this.messages = msgs;
    }

}
公共类MessagesAdapter扩展BaseAdapter{
私有静态int lastPos=-1;
私有数组列表消息;
私人语境;
公共消息适配器(ArrayList消息、上下文){
this.messages=消息;
this.context=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
convertView=充气机。充气(R.layout.message\u list\u行,空);
ViewHolder ViewHolder=新ViewHolder();
viewHolder.title=(TextView)convertView.findViewById(R.id.msgTitle);
viewHolder.body=(TextView)convertView.findViewById(R.id.msgBody);
viewHolder.monthDate=(TextView)convertView.findViewById(R.id.monthDate);
viewHolder.dayDate=(TextView)convertView.findViewById(R.id.dayDate);
viewHolder.status=(ImageView)convertView.findViewById(R.id.statusIcon);
viewHolder.linearLayout=(linearLayout)convertView.findViewById(R.id.hiddenLayout);
viewHolder.linearLayout.setVisibility(View.GONE);
convertView.setTag(viewHolder);
}
ViewHolder=(ViewHolder)convertView.getTag();
if(!(messages.get(position.isViewFlag()))
holder.linearLayout.setVisibility(View.GONE);
holder.title.setText(messages.get(position.getTitle());
holder.body.setText(messages.get(position.getBody());
开关(messages.get(position.getMessageType()){
案情如下:
持有者。状态。挫折资源(R。可绘制。黄色圆圈);
打破
未读案例:
持有者。状态。挫折资源(R。可绘制。红色圆圈);
打破
}
lastPos=位置;
返回视图;
}
@凌驾
public int getCount(){
返回消息。size();
}
@凌驾
公共对象getItem(int位置){
返回消息。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
静态类视窗夹{
公共文本视图标题;
公共文本视图机构;
公共文本视图日期;
公共文本视图monthDate;
公众视野状态;
公共文本视图读取;
公共文本视图未读;
删除公共文本视图;
公共文本查看回复;
公共线性布局线性布局;
}
公共无效设置消息(ArrayList msgs){
this.messages=msgs;
}
}

直接修改
列表视图中视图的可见性不是一个好主意。作为一种常规模式,您需要更新备份您案例中消息数组的
列表视图的数据。您需要在
消息中设置isViewFlag属性,而不是试图更改视图上的可见性,因为您无法控制正在使用哪个项目

单击处理程序只需执行以下操作(并遵循适配器中的更改):


您必须在
消息
类中添加布尔标志
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    msgAdapter.setExpandedPosition(msgAdapter.getExpandedPosition() == position ? -1 : position);
    return true;
}
public class MessagesAdapter extends BaseAdapter {
    // for Option1 - only one item expanded at a time
    int expandedPos = -1;
    ....

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ....
        //Option 1 - only one item expanded at a time
        holder.linearLayout.setVisibility(position == expandedPos ? View.GONE : View.VISIBLE);
        //Option 2 - multiple items can be expanded at the same time, following your current implementation
        holder.linearLayout.setVisibility(messages.get(position).isViewFlag() ? View.VISIBLE : View.GONE);
        ....
    }

    public void setExpandedPosition(int position) {
        //Option 1 - only one item expanded at a time
        expandedPos = position;

        //Option 2 - multiple items can be expanded at the same time, following your current implementation
        messages.get(position).setIsViewFlag(position != -1);

        // In both cases:
        notifyDataSetChanged();
    }


    // only for Option 1 - only one item expanded at a time
    public int getExpandedPosition() {
        return expandedPos;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public void setMessages(ArrayList<Message> msgs) {
        this.messages = msgs;
        notifyDataSetChanged();
    }

}