3

グリッドの残りの部分と一緒にスクロールする gridview ヘッダーを実装する方法について、多くの解決策を見てきました。

それらのほとんどは、ヘッダービューとグリッドビューをすべてスクロールビュー内に持つリストレイアウトまたは相対レイアウトを作成することで構成されています。このソリューションには、スクロールビューがグリッドのサイズを認識しないという問題があるため、次のようにグリッドビューを拡張する必要があることを克服するために: https://stackoverflow.com/a/4536955/751180

しかし、問題は、グリッドビューがセルをリサイクルせずに一度にすべてのアイテムをレンダリングすることを強制していることです。これにより、特にビューに画像が含まれている場合、メモリの使用量が多くなり、アプリがクラッシュする可能性があります。

他の人はリストビューを使用して、画面サイズに応じて配置できる列の数を計算しています。個人的にはグリッドビューを使い続けたいと思っています。

別のアプローチを使用して gridview ヘッダーを実装した人はいますか?

4

4 に答える 4

4

正しいヘッダーを GridView に設定するのに多くの時間を費やしました。成功しません。カスタム GridView (ListView から継承) を実装することが唯一の合理的な方法であるようです。ヘッダーとフッターを含む GridView の例を次に示します: https://github.com/SergeyBurish/HFGridView

于 2013-08-22T12:43:28.360 に答える
3

次のライブラリを使用してみてください https://github.com/maurycyw/HeaderGridView 参考になるかもしれません。

于 2013-06-24T10:38:50.873 に答える
0

回答が少し遅れましたが、私の経験では、これは GridLayoutManager.SpanSizeLookup ヘルパー クラスを使用して RecyclerView API を介して可能です。たとえば、アクティビティ/フラグメントで次のことができます。

mRecyclerView = (RecyclerView) view.findViewById(R.id.your_recycler_view);
mLayoutManager = new GridLayoutManager(mContext, 2);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        if (position == 0) {
            return 2;
        } else {
            return 1;
        }
    }
});
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new RecyclerAdapter();
mRecyclerView.setAdapter(mAdapter);

グリッドの先頭 (位置 == 0) にある場合、ViewHolder は最大列スパン (この状況では 2) を取得します。アダプター クラスでは、ヘッダーとアイテムのビュー タイプの定数を指定int getItemViewType(int position)し、アダプターの位置に基づいてビュー タイプを返すメソッドをオーバーライドする必要があります。次にRecyclerView.ViewHolder onCreateViewHolder(ViewGroup container, int viewType)、現在の viewType に基づいて適切なレイアウトをインフレートします。

うまくいけば、これは将来の読者に役立ちます。驚いたことに、GridView ヘッダーに関する同様の質問に対して、このソリューションは見たことがありません。

于 2015-12-10T00:13:51.843 に答える
0

SDカードの場所のソースからの画像のヘッダーを使用してカスタムグリッドビューを作成しました。以下に配置している私のプロジェクト全体。それが誰かに完全に役立つ場合は、評判を上げるために私に投票してください.

public class MainActivity extends Activity {
    private File file;

    LinearLayout linear;
    ArrayList<Bitmap> listbitmap;
    String[] folderlist ;
    ExpandableHeightGridView gridview;
    LinearLayout linearhere;
    String imageInSD = Environment.getExternalStorageDirectory().getAbsolutePath() +"/Hi";

    ArrayList<String> mylist = new ArrayList<String>();


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        linear = (LinearLayout) findViewById(R.id.linear);
        File imagesSource = new File(imageInSD);
        File[] dictoryFiles = imagesSource.listFiles();

        for(int i =0; i<dictoryFiles.length;i++){
            mylist.add(dictoryFiles[i].getName());
        }

        folderlist = mylist.toArray(new String[mylist.size()]);

        linearhere = new LinearLayout(getApplicationContext());
        linearhere.setOrientation(LinearLayout.VERTICAL);
        for (int k = 0; k < folderlist.length; k++) {



            TextView textview = new TextView(getApplicationContext());
            textview.setTextColor(Color.BLACK);
            textview.setTextSize(20);
            textview.setText(folderlist[k]);

            gridview = new ExpandableHeightGridView(getApplicationContext());
            gridview.setId(Calendar.SECOND);

            gridview.setLayoutParams(new GridView.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
            gridview.setBackgroundColor(Color.WHITE);
            gridview.setNumColumns(3);
            gridview.setColumnWidth(GridView.AUTO_FIT);
            gridview.setVerticalSpacing(5);
            gridview.setHorizontalSpacing(5);
            gridview.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);


            listbitmap = new ArrayList<Bitmap>();
            file = new File(imageInSD + "/" + folderlist[k]);
            File list[] = file.listFiles();

            for (int i = 0; i < list.length; i++) {

                String sp=list[i].getName();
                //if(sp.startsWith("123")){
                    //textview.setText(folderlist[k]);
                File image = new File(imageInSD + "/"+folderlist[k]+"/" + list[i].getName());

                InputStream fis = null;
                try {
                    fis = new FileInputStream(image.getAbsolutePath());
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;
                Bitmap bm = BitmapFactory.decodeStream(fis, null, options);
                listbitmap.add(bm);
                //}
            }
            gridview.setAdapter(new CustomGridAdapter(getApplicationContext(),
                    listbitmap));
            gridview.setExpanded(true);

            linearhere.addView(textview);
            linearhere.addView(gridview);

        }

        linear.addView(linearhere);

    }

}

======================
class2
======================

public class ExpandableHeightGridView extends GridView
{

    boolean expanded = false;

    public ExpandableHeightGridView(Context context)
    {
        super(context);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs,
            int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public boolean isExpanded()
    {
        return expanded;
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        // HACK! TAKE THAT ANDROID!
        if (isExpanded())
        {
            // Calculate entire height by providing a very large height hint.
            // View.MEASURED_SIZE_MASK represents the largest height possible.
            int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
                    MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);

            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();
        }
        else
        {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void setExpanded(boolean expanded)
    {
        this.expanded = expanded;
    }
}

======================
class 3:
======================
public class CustomGridAdapter extends BaseAdapter {

    private Context context;
    private final ArrayList<Bitmap> gridValues;

    // Constructor to initialize values
    public CustomGridAdapter(Context context, ArrayList<Bitmap> gridValues) {

        this.context = context;
        this.gridValues = gridValues;
    }

    @Override
    public int getCount() {

        // Number of times getView method call depends upon gridValues.length
        return gridValues.size();
    }

    @Override
    public Object getItem(int position) {

        return position;
    }

    @Override
    public long getItemId(int id) {

        return id;
    }

    // Number of times getView method call depends upon gridValues.length

    public View getView(int position, View convertView, ViewGroup parent) {

        // LayoutInflator to call external grid_item.xml file

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;

        if (convertView == null) {

            gridView = new View(context);

            // get layout from grid_item.xml ( Defined Below )

            gridView = inflater.inflate(R.layout.grid_item, null);

            ImageView imageView = (ImageView) gridView
                    .findViewById(R.id.grid_item_image);

            imageView.setImageBitmap(gridValues.get(position));

        } else {

            gridView = (View) convertView;
        }

        return gridView;
    }
}
=========================
activity_main.xml Code:
=========================

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"

    android:layout_height="wrap_content" >

            <LinearLayout
                android:id="@+id/linear"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#D8D8D8"

                android:orientation="vertical" >

            </LinearLayout>


</ScrollView>

==========================
grid_item.xml code:
==========================

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/grid_item_image"
        android:layout_width="180dp"
        android:layout_margin="5dp"
        android:layout_height="150dp"
        >
    </ImageView>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="0dp" >

    </LinearLayout>

</LinearLayout>
于 2015-03-06T07:15:26.417 に答える