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