我的问题是 - 如何创建自定义列表视图,而不仅仅是重复一个自定义视图,但像在Instagram或其他应用程序中列表包含其他视图,它看起来像滚动视图与列表视图android其他视图在其中但罗曼盖伊说,滚动视图中的列表视图是一种非常糟糕的方式,并且我同意它,不相信谷歌会用这种方式...... < / p>
使用ListView或Recycler View实现此功能的最佳方法是什么
答案 0 :(得分:3)
要实现该UI,您必须为Listview或Recyclerview定义多种视图类型;一个非常相似的问题已被回答here。
在您的示例中,您将有两种视图类型:
<Horizontal Scroll>
这是embedded horizontal Recyclerview/Listview。<View>
这是您定义的视图类型。这个概念有很多tutorials。我建议您在实施中使用Recyclerview,因为advantages over Listview。
答案 1 :(得分:2)
嘿,这就是你的主要片段的样子:
package com.leoneo.stackoverflow;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.soulpatch.stackoverflow.R;
import java.util.ArrayList;
public class RecyclerViewExample extends Fragment {
private ArrayList<Object> mValues = new ArrayList<>();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final RecyclerView recyclerView = inflater.inflate(R.layout.recycler_view_example, container, false);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
final MultpleItemAdapter adapter = new MultpleItemAdapter(mValues);
recyclerView.setAdapter(adapter);
return recyclerView;
}
}
这是你的适配器代码。
package com.leoneo.stackoverflow;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.soulpatch.stackoverflow.R;
import java.util.ArrayList;
public class MultpleItemAdapter extends RecyclerView.Adapter<MultpleItemAdapter.ViewHolder> {
private ArrayList<Object> mValues = new ArrayList<>();
public MultpleItemAdapter(ArrayList<Object> values) {
mValues = values;
}
enum ItemType {
TYPE_A,
TYPE_B;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 1:
//Inflate Type A layout
final LinearLayout linearLayoutA = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_a, parent, false);
//And pass the view to the ViewHolder
return new ViewHolder(linearLayoutA);
break;
case 2:
//Inflate Type B layout
final LinearLayout linearLayoutB = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_b, parent, false)
//And pass the view to the ViewHolder
return new ViewHolder(linearLayoutB);
break;
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case 1:
final TypeA typeA = (TypeA) mValues.get(position);
//Deal with the views that you defined for LinearLayout A
break;
case 2:
final TypeB typeB = (TypeB) mValues.get(position);
//Deal with the views that you defined for LinearLayout B
break;
}
}
@Override
public int getItemCount() {
return mValues.size();
}
@Override
public int getItemViewType(int position) {
final Object obj = mValues.get(position);
if (obj instanceof TypeA) {
return ItemType.TYPE_A.ordinal();
} else if (obj instanceof TypeB) {
return ItemType.TYPE_B.ordinal();
}
return super.getItemViewType(position);
}
static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
}
//Class that I want to be displayed in a CardView
private class TypeA {
}
//Class that I want to be displayed in a a LinearLayout
private class TypeB {
}
}
您可以拥有任意数量的课程,例如TypeA
和TypeB
,并相应地向ItemType
课程添加类型。
假设您之前使用过RecyclerViews,休息应该是非常自我解释的。
答案 2 :(得分:2)
您正在寻找不同的视图类型。使用这些
是可能的 GetViewTypeCount()
这是一个可覆盖的方法,它返回listview-recycleview中有多少种视图类型。
getItemViewType(int pos)
获取应在给定位置返回的项目视图类型
例如,如果您想在每10个项目中添加不同的视图,并且只有2种类型的视图,则应使用如下代码:
@Override
public int getItemViewType(int position){
if (position % 10 == 0)
return SECOND_ITEM;
return FIRST_ITEM;
}
@Override
public int getViewTypeCount() {
return 2;
}
在getView()
函数中,您可以使用switch-case或if-else结构来处理它:
switch (getItemViewType(cursor.getPosition())) {
case SECOND_ITEM:
//something to do
break;
default:
//something to do
}
您可能希望在上面的switch-case语句中使用2个不同的布局文件来充气。但是,如果两个项目的布局没有太大差别,我建议只创建一个布局,并根据您想要获得的项目使其中的视图可见并消失。
哦,如果你不知道在哪里使用它们,你可以在适配器类中使用它们。函数可能因您使用的适配器类型而异,但它们都使用相同的逻辑。
最后,我建议你使用recyclerview。它实现比listview更难,但它是listview的一个很好的替代,它更强大,更灵活。你可以为它做一个研究。
以下是如何实现这一点,如instagram,facebook等:您在给定位置充气可滚动视图。
我希望答案有所帮助。
一如既往 祝你今天愉快。