RecyclerView应用 —— 好友列表实现

实现的效果类似于QQ好友列表,点击可展开,再次点击收起:
无动画好友列表
两个Item的布局都很简单,这里就不给布局代码了。值得一提的是,RecyclerView本身并没有ListView那样的点击效果,想要类似效果可以为Item的根布局写个Selector,然后设置android:clickable="true"
接下来就是两个实体类,也比较简单:

public class ContactGroup {

    private String groupName;
    private boolean isExpand;
    private List<ContactInfo> contacts;
}
public class ContactInfo {

    private int imageResId;
    private String nickname;
    private String description;
}

最后是Adapter的实现,由于有两个不同Item,我们选择数据源为Object的容器,然后再根据元素的类型来载入不同的布局,代码如下:

public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactsViewHolder>
        implements View.OnClickListener {

    private Context mContext;
    private List<Object> mData;
    private RecyclerView mRvContacts;

    public ContactsAdapter(Context context, List<Object> data) {
        mContext = context;
        mData = data;
    }

    /**
    * 该方法返回值可以为任意值,直接返回需要绑定的Item布局id,
    * 这样在绑定视图时就不用对类型进行判断,拿到入参viewType即可。
    */
    @Override
    public int getItemViewType(int position) {
        int ret = 0;
        if (mData.get(position) instanceof ContactGroup) {
            ret = R.layout.item_group_contacts;
        }
        if (mData.get(position) instanceof ContactInfo) {
            ret = R.layout.item_contacts;
        }
        return ret;
    }

    @Override
    public ContactsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(viewType, parent, false);
        view.setOnClickListener(this);

        return new ContactsViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ContactsViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case R.layout.item_group_contacts:
                ContactGroup group = (ContactGroup) mData.get(position);
                holder.tvGroupName.setText(group.getGroupName());
                break;

            case R.layout.item_contacts:
                ContactInfo contact = (ContactInfo) mData.get(position);
                holder.ivAvatar.setImageResource(contact.getImageResId());
                holder.tvNickname.setText(contact.getNickname());
                holder.tvDescription.setText(contact.getDescription());
                break;
        }
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    /**
    * 拿到与当前Adapter绑定的RecyclerView
    */ 
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        mRvContacts = recyclerView;
    }

    /**
    * 首先拿到当前的点击位置,然后通过判断当前Item的数据类型进行操作
    */ 
    @Override
    public void onClick(View v) {
        int position = mRvContacts.getChildAdapterPosition(v);
        Object o = mData.get(position);
        if (o instanceof ContactGroup) {
            ContactGroup contactGroup = (ContactGroup) o;
            // 展开收起时,分组头部的小三角形状态会有改变,这里拿到当前位置的ViewHolder对象
            ContactsViewHolder holder = (ContactsViewHolder) mRvContacts.getChildViewHolder(v);
            if (contactGroup.isExpand()) {
                // 从当前位置的底部移除已展开的好友列表,更新isExpand,最后再改变小三角形的状态
                removeAll(position + 1, contactGroup.getContacts());
                contactGroup.setExpand(false);
                holder.ivIsExpand.setImageResource(R.drawable.triangle_right);
            } else {
                addAll(contactGroup.getContacts());
                contactGroup.setExpand(true);
                holder.ivIsExpand.setImageResource(R.drawable.triangle_bottom);
            }
        } else if (o instanceof ContactInfo) {
            ContactInfo contactInfo = (ContactInfo) o;
            ToastUtils.show(mContext, contactInfo.getNickname());
        }

    }

    public void addAll(int position, Collection data) {
        mData.addAll(position, data);
        notifyDataSetChanged();
    }

    public void removeAll(Collection data) {
        mData.removeAll(data);
        notifyDataSetChanged();
    }

    public class ContactsViewHolder extends RecyclerView.ViewHolder {

        TextView tvGroupName;
        ImageView ivIsExpand;

        ImageView ivAvatar;
        TextView tvNickname;
        TextView tvDescription;

        public ContactsViewHolder(View itemView) {
            super(itemView);

            tvGroupName = (TextView) itemView.findViewById(R.id.tv_contacts_group_name);
            ivIsExpand = (ImageView) itemView.findViewById(R.id.iv_is_expand);

            ivAvatar = (ImageView) itemView.findViewById(R.id.iv_avatar);
            tvNickname = (TextView) itemView.findViewById(R.id.tv_nickname);
            tvDescription = (TextView) itemView.findViewById(R.id.tv_description);
        }
    }
}

如果需要实现带动画效果的展开与收齐,只需要替换几行代码即可:

public void addAll(int position, Collection data) {
    mData.addAll(position, data);
    notifyItemRangeInserted(position, data.size());
}

public void removeAll(int position, Collection data) {
   mData.removeAll(data);
   notifyItemRangeChanged(position, data.size());
}

默认的动画效果如下:
淡出动画好友列表
如果需要修改默认的动画效果,可以参考我的这篇文章:RecyclerView详解 —— 自定义动画

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的 Android RecyclerView 设计的好友聊天列表代码: 1. 在布局文件中添加 RecyclerView: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical"/> ``` 2. 创建 RecyclerView 的 Adapter: ```java public class ChatListAdapter extends RecyclerView.Adapter<ChatListAdapter.ViewHolder> { private List<ChatMessage> chatMessages; public ChatListAdapter(List<ChatMessage> chatMessages) { this.chatMessages = chatMessages; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_message, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { ChatMessage message = chatMessages.get(position); holder.bind(message); } @Override public int getItemCount() { return chatMessages.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { private TextView messageTextView; private TextView timeTextView; public ViewHolder(@NonNull View itemView) { super(itemView); messageTextView = itemView.findViewById(R.id.message_text_view); timeTextView = itemView.findViewById(R.id.time_text_view); } public void bind(ChatMessage message) { messageTextView.setText(message.getMessage()); timeTextView.setText(message.getTime()); } } } ``` 3. 创建聊天消息的数据模型: ```java public class ChatMessage { private String message; private String time; public ChatMessage(String message, String time) { this.message = message; this.time = time; } public String getMessage() { return message; } public String getTime() { return time; } } ``` 4. 创建 RecyclerView 的 Item 布局文件: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginTop="8dp" android:orientation="vertical"> <TextView android:id="@+id/message_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bg_chat_message" android:padding="8dp" android:textColor="@android:color/primary_text_light"/> <TextView android:id="@+id/time_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:textColor="@android:color/secondary_text_dark"/> </LinearLayout> ``` 5. 在 Activity 或 Fragment 中初始化 RecyclerView 和 Adapter: ```java public class ChatListActivity extends AppCompatActivity { private RecyclerView recyclerView; private ChatListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat_list); List<ChatMessage> chatMessages = new ArrayList<>(); chatMessages.add(new ChatMessage("Hello", "10:00 AM")); chatMessages.add(new ChatMessage("How are you?", "10:01 AM")); chatMessages.add(new ChatMessage("I'm fine, thank you. And you?", "10:02 AM")); chatMessages.add(new ChatMessage("I'm good too. Thanks for asking.", "10:03 AM")); recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new ChatListAdapter(chatMessages); recyclerView.setAdapter(adapter); } } ``` 这样就完成了 RecyclerView 的设计和好友聊天列表的代码实现
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值