我正在尝试实现一个类似IM的应用程序,但我遇到的问题确实让我烦恼。
我使用recyclerview
以滚动方式显示消息,以便用户可以滚动视图以查看所有消息。消息的基本布局是cardview
小部件。
此外,我在消息的布局中使用了另一种布局,也是cardview
来显示子消息。
为了更详细,我想想象一下我使用的布局。请看下面的图片:
如您所见,我使用两个嵌套的卡片视图(彼此内部)。此外,当我使用recyclerview
作为子消息时,我有滚动行为。当我滚动子消息时,将调用recyclelerview的onBindViewHolder方法。要检索每个图像,我在onBindViewHolder方法中调用API。
现在当我想要滚动子消息时出现问题。似乎在调用API时出现了问题。虽然从API成功检索图像,但它会向下跳转到屏幕。
例如,如果我向上滚动上一条消息的子消息。它最终得到以下结果:
这是适用于子消息的onBindViewHolder()
方法,对于处理图像,我使用Glide android库:
public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
.
.
.
public void onBindViewHolder(ViewHolder holder, int position) {
SubMessage subMessage = subMessageList.get(position);
final long mediaFileId = subMessage.getMediaFileId();
holder.ivSubmessageImage.setImageDrawable(null);
if (mediaFileId != 0) {
holder.ivSubmessageImage.setImageResource(R.mipmap.ic_launcher);
holder.ivSubmessageImage.setMinimumHeight(100);
holder.ivSubmessageImage.setMinimumWidth(200);
Glide.with(context).load(Config.FILE_SERVER_URL+"api/file/" + mediaFileId + "/thumb")
.into(holder.ivSubmessageImage);
holder.ivSubmessageImage.setVisibility(View.VISIBLE);
} else {
holder.ivSubmessageImage.setImageBitmap(null);
holder.ivSubmessageImage.setVisibility(View.INVISIBLE);
}
...
}
.
.
.
}
这是我创建的布局(目前):
channel_log_list.xml (msgCardview)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
app:cardCornerRadius="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/MyCardViewStyle"
android:layout_marginTop="3dp"
android:padding="2dp"
android:layout_marginBottom="1dp"
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
android:layout_marginRight="23dp"
app:cardPreventCornerOverlap="false"
android:layout_marginLeft="23dp"
app:cardBackgroundColor="@color/chatMsgBg"
android:id="@+id/channelLogCard"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/ivMessageImage"/>
<com.example.TextViewPlus
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="messages"
app:customFont="@string/irs"
android:id="@+id/channelLogAppletTitle"
android:textSize="@dimen/content_text_size_small2"
android:layout_marginBottom="10dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/lstSubMessages"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
sub_message_list_item.xml (subMsgCardview)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="200dp"
app:cardCornerRadius="3dp"
android:layout_height="300dp"
style="@style/SubMessageCardViewStyle"
android:id="@+id/SubMessageCard">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layoutDirection="rtl">
<ImageView
android:layout_width="match_parent"
android:layout_height="110dp"
android:id="@+id/ivSubMessageImage"
android:visibility="invisible"/>
<com.example.TextViewPlus
android:padding="5dp"
android:layout_marginTop="10dp"
android:id="@+id/tvText"
app:customFont="@string/irs"
android:textSize="@dimen/content_text_size_small1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</android.support.v7.widget.CardView>
答案 0 :(得分:0)
制作您的Cardview android:focusableInTouchMode="true" or make that layout which you want to focus