我创建了一个非常简单的项目,StaggeredGridLayoutManager通过recyclerview 显示28个图像.但是当我滚动Recyclerview时,它会移动项目,例如从左向右移动或交换左右列.
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
public class MainActivity extends Activity {
String mImageDir;
private RecyclerView mRecyclerView;
private StaggeredGridLayoutManager mLayoutManager;
MyRecyclerAdapter myRecyclerAdapter;
List<ImageModel> mImageList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView)findViewById(R.id.recyclerview_rootview);
mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setHasFixedSize(false);
mImageList = new ArrayList<ImageModel>();
for (int i = 1; i < 29 ; i++) {
ImageModel img = new ImageModel();
img.setTitle("Image No " + i);
int drawableResourceId …Run Code Online (Sandbox Code Playgroud) android recycler-adapter staggeredgridlayout android-recyclerview
我CardView在XML中定义了多个:
<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
card_view:cardPreventCornerOverlap="false"
card_view:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView
android:textSize="@dimen/abc_text_size_title_material"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)
对于手机,我已经将多个包装CardView在垂直方向LinearLayout:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
Run Code Online (Sandbox Code Playgroud)
对于平板电脑,我想使用网格布局,类似于Material Design规范中使用的设计,请参见此处的图像.
ViewGroup制作网格布局最好用的是什么?这些卡的高度可变,并且具有静态内容.
GridLayout 不能使用,因为卡的高度可变.
我正在使用PinterestLikeAdapterView库来显示来自互联网的一些图像,这类似于gridView但每个单元格的高度不同.
由于我使用此库来显示来自互联网的图像,因此调用notifyDatasetChanged时不会导致视图混乱至关重要.
出于某种原因,调用此函数会调用具有不同位置的getView()方法.例如,即使我根本没有滚动,并调用notifyDatasetChanged(或者addAll,以防它是ArrayAdapter),对于位置0,它将采取位置8的视图,对于位置1,它将采取位置视图7,依此类推......
这使整个网格刷新其图像,因此它破坏了UX.
通常,在gridView和listView中,克服刷新的方法是将用于视图的位置放在viewHolder中,如果它们相等,则表示它们仍然匹配.
例如:
... getView(...)
{
//<=inflate a new view if needed
//avoid refreshing view in case it's still the same position:
if(position==holder.position)
return rootView;
holder.position=position;
//<=update the view according to its data
...
}
Run Code Online (Sandbox Code Playgroud)
但是,这里他们以不同的顺序重用其他视图,所以这个技巧在这里不起作用.
由于这个问题,我不仅刷新了几乎所有可见的视图,而且因为我使用DiskCacheLru库,它崩溃了,因为它试图使用2个线程将2个相同的inputSteam数据放入同一个键中.
我能做什么?这是库中的已知错误吗?
也许我用一种糟糕的方法来克服刷新?
现在,我使用内存缓存至少获得之前缓存的项目,但这更像是一种"治疗"而不是"疫苗"......
我想建立一个自定义列表(Pinterest网格布局),我想扩展AbsListView.周围有很好的例子吗?这似乎非常困难.
谢谢托比亚
一直在搜索可以创建类似于tumblr/archive页面的gridview的库.
例如:sweethomestyle.tumblr.com/archive或任何tumblr博客然后/存档
它的作用是保持图像的纵横比,但要使它们都适合屏幕.我知道这一点,但我不确定它是什么.
我想在android中复制这个,图像将是所有不同的大小.

我期待创造一个音乐应用程序,我想做出GridView类似于谷歌Play使用他们注入,将跨越像撒旦之作乐团专辑的行和列的元素确实在这个截图:

我想过使用ListView和填充用自定义元素行,但我想不出使用与ViewHolder模式,或者一个真正的方法,使这种可重复使用和账户基础上的宽度不同的项目数的好方法屏幕尺寸(例如,格宽只有两个项目上的电话,和"大"的项目跨越两列,只有一行).
我也考虑使用ScrollView填充自定义ViewGroups,但这似乎遇到了我之前提到的相同问题.
我接下来考虑使用GridLayout,但是这不接受ListAdapters,并且似乎没有调整到我正在看的那种用法(它似乎也没有滚动)
如果有人能给我某个地方开始,我会非常感激,或者可以指向我这样做的图书馆.我已经检查过StaggeredGridView,但它似乎没有完成我想要的.我理想的解决方案是一个视图,它在偶数网格上布置项目,GridView并接受来自a的视图ListAdapter,也可以GridView,但允许元素跨越,使用单个单元格约束GridView作为默认行为.
干杯.
编辑
我有一个完美的功能GridView,如下所示,但我想定期(每n一项)制作项目跨越多个列和/或行,如上一个屏幕截图所示.
