如何在android中使网格视图水平滚动
我已经写了GridView的代码,我可以显示图像和文字,但我想显示在单个可滚动的行像脉冲新闻应用程序中的所有图像。 我已经在xml中为gridview实现了horizontalscroll-view,但是根本不起作用。 我正在使用pageviwer的标签,我正在使用片段。
这是我的xml代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:fillViewport="true" android:scrollbars="horizontal" > <GridView android:layout_width="500dp" android:layout_height="400dp" android:id="@+id/gridview" android:columnWidth="300dp" android:numColumns="3" android:horizontalSpacing="10dp" android:scrollbars="horizontal"> </GridView> </HorizontalScrollView> </RelativeLayout>
这是我的图像adpator代码
public class ImageAdapter extends BaseAdapter { private Context context; private final String[] mobileValues; private TextView t; public ImageAdapter(Context context, String[] mobileValues) { this.context = context; this.mobileValues = mobileValues; } public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View gridView; if (convertView == null) { gridView = new View(context); // get layout from mobile.xml gridView = inflater.inflate(R.layout.showlist_item, null); // set value into textview TextView textView = (TextView) gridView .findViewById(R.id.grid_item_label); textView.setText(mobileValues[position]); // set image based on selected text ImageView imageView = (ImageView) gridView .findViewById(R.id.grid_item_image); String mobile = mobileValues[position]; if (mobile.equals("Windows")) { imageView.setImageResource(R.drawable.test_play_image); } else if (mobile.equals("iOS")) { imageView.setImageResource(R.drawable.test_play_image); } else if (mobile.equals("Blackberry")) { imageView.setImageResource(R.drawable.test_play_image); } else { imageView.setImageResource(R.drawable.test_play_image); } } else { gridView = (View) convertView; } return gridView; } private void clickedButton(TextView tv){ int num = Integer.parseInt(tv.getText().toString()); ++num; tv.setText(Integer.toString(num)); } private void clickedButtonm(TextView tv){ int num = Integer.parseInt(tv.getText().toString()); if(num>0){ --num; tv.setText(Integer.toString(num)); } } public int getCount() { return mobileValues.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } class MyOnClickListener implements OnClickListener{ public final TextView tv; public MyOnClickListener(TextView tv){ this.tv=tv; } public void onClick(View v) { // TODO Auto-generated method stub clickedButton(tv); } } class MyOnClickListenerm implements OnClickListener{ public final TextView tv; public MyOnClickListenerm(TextView tv){ this.tv=tv; } public void onClick(View v) { // TODO Auto-generated method stub clickedButtonm(tv); } }
我想要像这样滚动到右边。
我发现双向GridView有助于github。
它有一些方法:
scrollDirectionPortrait (vertical | horizontal)
scrollDirectionLandscape (vertical | horizontal)
numRows()
等等
从现在开始,Android中有一个很好的解决scheme(如Zainodis在其评论中所说): HorizontalGridView 。
1. Gradle依赖
dependencies { compile 'com.android.support:leanback-v17:23.1.0' }
2.将其添加到您的布局
your_activity.xml
<!-- your stuff before... --> <android.support.v17.leanback.widget.HorizontalGridView android:layout_width="wrap_content" android:layout_height="80dp" android:id="@+id/gridView" /> <!-- your stuff after... -->
3.布局网格元素
为您的网格元素( grid_element.xml )创build一个布局。 我创build了一个简单的只有一个button。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" /> </LinearLayout>
4.创build一个适配器
受此链接高度启发: https : //gist.github.com/gabrielemariotti/4c189fb1124df4556058
public class GridElementAdapter extends RecyclerView.Adapter<GridElementAdapter.SimpleViewHolder>{ private Context context; private List<String> elements; public GridElementAdapter(Context context){ this.context = context; this.elements = new ArrayList<String>(); // Fill dummy list for(int i = 0; i < 40 ; i++){ this.elements.add(i, "Position : " + i); } } public static class SimpleViewHolder extends RecyclerView.ViewHolder { public final Button button; public SimpleViewHolder(View view) { super(view); button = (Button) view.findViewById(R.id.button); } } @Override public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final View view = LayoutInflater.from(this.context).inflate(R.layout.grid_element, parent, false); return new SimpleViewHolder(view); } @Override public void onBindViewHolder(SimpleViewHolder holder, final int position) { holder.button.setText(elements.get(position)); holder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context, "Position =" + position, Toast.LENGTH_SHORT).show(); } }); } @Override public long getItemId(int position) { return position; } @Override public int getItemCount() { return this.elements.size(); } }
5.在你的活动中初始化它:
private HorizontalGridView horizontalGridView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity); horizontalGridView = (HorizontalGridView) findViewById(R.id.gridView); GridElementAdapter adapter = new GridElementAdapter(this); horizontalGridView.setAdapter(adapter); }
我以前的答案: 水平滚动网格视图
我张贴相同的节省时间—
有一个非常简单的伎俩。
- 将网格视图旋转270度,并将列数设置为2。
- 将每个项目旋转90度(以便项目显示为原始方向)。
这可能对一些有用!
<HorizontalScrollView android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_below="@+id/seatLegendLayout"> <FrameLayout android:layout_width="fill_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/linearLayout_gridtableLayout" android:layout_width="900dp" android:layout_height="match_parent" android:orientation="horizontal"> <GridView android:id="@+id/gridView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="4dp" android:columnWidth="100dp" android:gravity="center" android:numColumns="9" android:horizontalSpacing="1dp" android:scrollbarAlwaysDrawHorizontalTrack="true" android:scrollbarAlwaysDrawVerticalTrack="true" android:scrollbars="horizontal" android:stretchMode="none" android:verticalSpacing="1dp"> </GridView> </LinearLayout> </FrameLayout> </HorizontalScrollView>
有一个更好的清洁工作解决scheme,我已经testing,没有任何一种额外的依赖只是改变你的布局xml类似下面的东西。
<HorizontalScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <android.support.v7.widget.RecyclerView android:id="@+id/horizontal_grid_view" android:layout_width="wrap_content" android:layout_height="112dp" android:scrollbarAlwaysDrawVerticalTrack="true"></android.support.v7.widget.RecyclerView> </HorizontalScrollView>
在分配网格布局pipe理器时,还根据您的要求设置跨度计数。
我不认为gridviews可以横向滚动。 Android为此提供了galleryView。 你可以使用它。 这里是一个可以帮助你使galleryView作为水平gridview工作的游戏: – 在android gridview中水平滚动
对于一小部分数据来说,一个好的路线就是使用如下的布局来容器:
<HorizontalScrollView android_id="@+id/scroll_view" android_width="match_parent" android_height="wrap_content"> <LinearLayout android_id="@+id/my_list" android_width="wrap_content" android_height="wrap_content" > </LinearLayout> </HorizontalScrollView>
列表项(list_item.xml)的不同布局:
<FrameLayout android_id="@+id/item_container" android_width="100dp" android_height="100dp"> <ImageView android_id="@+id/item_background" android_width="match_parent" android_height="match_parent" /> <TextView android_id="@+id/item_title" android_width="match_parent" android_height="50dp" android_background="#80000000" android_gravity="center_vertical" /> </FrameLayout>
然后根据需要编程添加视图:
public void addItensToLayout(String... mobileValues, LayoutInflater inflater) { LinearLayout list = (LinearLayout) findViewById(R.id.my_list); for (String item : mobileValues) { FrameLayout item = inflater.inflate(R.layout.list_item, list, false); TextView textView = (TextView) gridView .findViewById(R.id.item_title); textView.setText(item); ImageView imageView = (ImageView) item .findViewById(R.id.item_background); String mobile = mobileValues[position]; if (mobile.equals("Windows")) { imageView.setImageResource(R.drawable.test_play_image); } else if (mobile.equals("iOS")) { imageView.setImageResource(R.drawable.test_play_image); } else if (mobile.equals("Blackberry")) { imageView.setImageResource(R.drawable.test_play_image); } else { imageView.setImageResource(R.drawable.test_play_image); } list.addView(item); } }
通过这样做,您不再使用适配器。 如果你真的需要使用一个适配器,你应该使用一个ViewPager ,在android文档中有足够的信息,或者你可以从这里开始在StackOverflow:
在我的应用程序 android viewPager中 使用viewpager 实现
如果我错过了任何一点,请索取更多信息。