【问题标题】:Problems with setting custom adapter for gridview and getting desired ouput为 gridview 设置自定义适配器并获得所需输出的问题
【发布时间】:2015-10-13 21:30:09
【问题描述】:

所以我按照教程为GridView 设置自定义adapter,不得不更改一些东西,因为它不适用于我的代码。没有错误,但我的输出不正确。我的图像和文本都加载到一个位置,而不是加载到所需的预设 GridView 布局中。我正在使用三个Fragments,因为从 mainactivity 运行的选项卡/滑动布局。真的,我在修改教程以使用我当前的fragments 时遇到了麻烦。有什么建议吗?

Fragment class/activity:

`public class BankingFrag extends Fragment  {
    GridView gv;

    public static String[] selections = {"Statements, Transfer, E-Transfer, Picture-Deposit "};
    public static int[] imgs = {R.drawable.ic_description_black_24dp, R.drawable.ic_swap_horiz_black_24dp
                            , R.drawable.ic_email_black_24dp, R.drawable.ic_camera_alt_black_24dp};

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container
            , @Nullable Bundle savedInstanceState) {


        View v = inflater.inflate(R.layout.fragment_banking, container, false);
        gv = (GridView) v.findViewById(R.id.gridView);
        gv.setAdapter(new CustomImageAdapter(v.getContext(),selections,imgs));


        return v;
    }


}`

fragment_banking.xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/activity_horizontal_margin">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/CHQ"
            android:layout_marginLeft="16dp"
            android:textSize="25sp"
           />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="4,302.98"
            android:ems="10"
            android:id="@+id/chqText"
            android:layout_marginLeft="30dp"
            android:textSize="20sp"/>

    </LinearLayout>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/activity_horizontal_margin">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/SAV"
            android:layout_marginLeft="16dp"
            android:textSize="25sp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="10,002.56"
            android:ems="10"
            android:id="@+id/savText"
            android:layout_marginLeft="30dp"
            android:textSize="20sp"/>

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       >

        <GridView android:id="@+id/gridView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:columnWidth="80dp"
            android:numColumns="auto_fit"
            android:verticalSpacing="10dp"
            android:horizontalSpacing="1dp"
            android:stretchMode="columnWidth"
            android:layout_margin="@dimen/activity_horizontal_margin"
            android:gravity="center" />

    </RelativeLayout>


</LinearLayout>

gridview_item.xml: 

    <?xml version="1.0" encoding="utf-8"?>
<!-- the parent view -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:padding="5dp" >

    <!-- the ImageView for the icon -->
    <ImageView android:id="@+id/ivIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="1dp"
        android:contentDescription=""
        android:scaleType="fitXY"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <!--  the TextView for the title -->
    <TextView android:id="@+id/opTitle"
        android:layout_below="@id/ivIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:lines="1"
        android:gravity="center_horizontal"
        android:layout_centerHorizontal="true"
        android:textAppearance="@android:style/TextAppearance.Medium" />
</RelativeLayout>

The custom adapter class, CustomImageAdpater.java

    package com.comp3717lab.matt.bankingapp;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class CustomImageAdapter extends BaseAdapter{

    String [] result;
    Context context;
    int [] imageId;
    private static LayoutInflater inflater=null;
    public CustomImageAdapter(Context c, String[] prgmNameList, int[] prgmImages) {
        // TODO Auto-generated constructor stub
        result=prgmNameList;
        context=c;
        imageId=prgmImages;
        inflater = ( LayoutInflater )context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return result.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class Holder
    {
        TextView text;
        ImageView img;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Holder holder=new Holder();
        View rowView;

        rowView = inflater.inflate(R.layout.gridview_item, null);
        holder.text=(TextView) rowView.findViewById(R.id.opTitle);
        holder.img=(ImageView) rowView.findViewById(R.id.ivIcon);

        holder.text.setText(result[position]);
        holder.img.setImageResource(imageId[position]);

        rowView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "You Clicked "+result[position], Toast.LENGTH_LONG).show();
            }
        });

        return rowView;
    }

}

Thanks for any help! PS new at android dev

【问题讨论】:

  • 你的意思是holder.img.setImageResource(imageId[position]);这是在一个地方加载图像吗?也代替了rowView = inflater.inflate(R.layout.gridview_item, null);中的null pass parent

标签: java android android-layout android-fragments gridview


【解决方案1】:

getView 方法有不少问题:

细胞应该被回收,你不应该初始化Holder holder=new Holder();

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{       
  if (convertView == null) {
        convertView = inflater.inflate(R.layout.gridview_item, parent,
                false);
       //It's a new view so update the data you need
  }
  else //It's a recycled view, so get a reference to it and update the data
  {
     //For example
     (TextView) convertView.findViewById(R.id.opTitle).setText("some text");

  }
}

【讨论】:

  • 感谢您的建议。我最终改变了整个事情,正如你所建议的那样,我改变了命名以使其更传统
猜你喜欢
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2011-05-15
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多