【问题标题】:Android Eclipse: GridView Items not clickable?Android Eclipse:GridView 项目不可点击?
【发布时间】:2014-12-19 18:00:56
【问题描述】:

我实现了一个网格视图,其中填充了“产品”数组以及填充了另一个“产品图像”数组,以构成 Sqlite 数据库中产品的网格视图列表。但是,当我设置 OnItemClickListener 时,当我在设备上运行应用程序时,gridview 项目不可点击。它只是能够向下滚动浏览产品和图像,但不可点击。

该应用程序运行良好,图像与产品详细信息一起显示,但每个网格项目不可点击。为什么会发生这种情况?

这是我的代码:

MainActivity 类

gridView = (GridView)findViewById(R.id.grid);
            ProductGridInflator bA = new ProductGridInflator(this, R.layout.home ,dbProducts, dbImages);
            gridView.setAdapter(bA);

            gridView.setOnItemClickListener(new OnItemClickListener() {


                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

                    Product currentProduct = new Product();

                    String product_name=null;

                    for(int i=0;i<dbProducts.size();i++)
                    {
                        product_name = dbProducts.get(i).NAME;
                    }

             //Sharing product details with all windows
                    SharedPreferences pref = getApplicationContext().getSharedPreferences("AppProduct", 0); // 0 - for private mode
                    Editor editor = pref.edit();
                    editor.putString("pname", product_name);
                    editor.commit();

                    Intent inn1=getIntent();
                    inn1=new Intent(HomeActivity.this, ProductSingle_Activity.class);
                    startActivity(inn1);

                }
            });

单个网格项的 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:background="@color/feed_bg"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="@dimen/feed_item_margin"
        android:layout_marginRight="@dimen/feed_item_margin"
        android:layout_marginTop="@dimen/feed_item_margin"
        android:background="@drawable/bg_parent_rounded_corner"
        android:orientation="vertical"
        android:paddingBottom="@dimen/feed_item_padding_top_bottom"
        android:paddingTop="@dimen/feed_item_padding_top_bottom" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="@dimen/feed_item_padding_left_right"
            android:paddingRight="@dimen/feed_item_padding_left_right" >

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingLeft="@dimen/feed_item_profile_info_padd" >

                <TextView
                    android:id="@+id/grid_text"
                    android:layout_width="285dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:textSize="18sp" />

                <TextView
                    android:id="@+id/more_details"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="02:12pm"
                    android:textColor="@color/timestamp"
                    android:textSize="@dimen/feed_item_timestamp" />

                <TextView
                    android:id="@+id/grid_desc"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:textColor="@color/timestamp"
                    android:textSize="15sp" />
            </LinearLayout>
        </LinearLayout>

        <HorizontalScrollView
            android:id="@+id/slider"
            android:layout_width="match_parent"
            android:layout_height="282dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_weight="0.55" >

            <ImageView
                android:id="@+id/grid_image"
                android:layout_width="285dp"
                android:layout_height="285dp" />
        </HorizontalScrollView>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="@dimen/feed_item_padding_left_right"
            android:paddingRight="@dimen/feed_item_padding_left_right" >

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingLeft="@dimen/feed_item_profile_info_padd" >

                <TextView
                    android:id="@+id/interaction_text"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="Likes: 34 Comments: 45"
                    android:textColor="@color/timestamp"
                    android:textSize="@dimen/feed_item_timestamp"/>

            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

Gridview 适配器

public class ProductGridInflator extends ArrayAdapter<Product>{
    private int[] Imageid; // this is the image id you are using... this is not initiatiliehs
    ArrayList<Product> dbProducts; // your person arraylist
    Context ctx; // the activity context
    int resource; // this will be your xml file
    ArrayList<Image> urlArr = new ArrayList<Image>();
    ArrayList<Image> dbImages = new ArrayList<Image>();

    public ProductGridInflator(Context context, int resource,ArrayList<Product> objects, ArrayList<Image> obj) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        this.dbProducts = objects;
        this.ctx = context;
        this.resource = resource;
        this.dbImages = obj;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        if(dbProducts.size() == 0){
            return 0;
        }else{
            return dbProducts.size();
        }
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View child = convertView;
        RecordHolder holder;
        LayoutInflater inflater = ((Activity) ctx).getLayoutInflater(); // inflating your xml layout


        if (child == null) {            
            child = inflater.inflate(R.layout.grid_single, parent, false);
            holder = new RecordHolder();
            holder.productName = (TextView) child.findViewById(R.id.grid_text); // fname is the reference to a textview
            //holder.productImage = (TextView) child.findViewById(R.id.txtLname); // in your xml layout file 
            //holder.bio =(TextView) child.findViewById(R.id.txtBio); // you are inflating.etc
            holder.image = (ImageView) child.findViewById(R.id.grid_image);
            holder.productDesc = (TextView) child.findViewById(R.id.grid_desc);
            holder.moreDetails = (TextView) child.findViewById(R.id.more_details);
            child.setTag(holder);
        }else{
            holder = (RecordHolder) child.getTag();
        }

        final Product user = dbProducts.get(position); // you can remove the final modifieer.

        holder.productName.setText(user.getNAME());      
        //holder.lname.setText(user.getLName());
        //holder.bio.setText(user.getBiography());


        HorizontalScrollView scroller = (HorizontalScrollView) child.findViewById(R.id.slider);
        for(int i=0;i<dbImages.size();i++)
        {
            if(dbImages.get(i).PID.equals(user.PID))
            {
                //Picasso.with(ctx).load(dbImages.get(i).URL).into(holder.image);
                Picasso.with(ctx)
                  .load(dbImages.get(i).URL)
                  .placeholder(R.drawable.loading_placeholder)
                  .error(R.drawable.error_placeholder)
                  .into(holder.image);
            }
            else
                continue;
        }

        holder.productDesc.setText(user.DESC);
        holder.moreDetails.setText(user.CATEGORY + " - " + "Rating: " + user.RATING + " - " + "Sizes: " + user.SIZE);

        // the string as url and set it to your imageview..
        return child;
    }

    static class RecordHolder {
        TextView productName;
        ImageView image;   
        TextView productDesc;
        TextView moreDetails;
    }

    @Override
    public void notifyDataSetChanged() { // you can remove this..
        // TODO Auto-generated method stub      
        if(getCount() == 0){
            //show layout or something that notifies that no list is in..
        }else{
            // this is to make sure that you can call notifyDataSetChanged in any place and any thread
            new Handler(getContext().getMainLooper()).post(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    ProductGridInflator.super.notifyDataSetChanged();
                }
            });
        }
    }
}

主 GridView XML(GridView 所在的窗口):

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="activity.classes.HomeActivity" >

    <RelativeLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8pt"
            android:gravity="center_horizontal"
            android:text="Jezza"
            android:textSize="25dip" />

        <TextView
            android:id="@+id/hub_error"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="2dip"
            android:textColor="#e30000"
            android:textStyle="bold" />

        <GridView
            android:id="@+id/grid"
            android:layout_width="fill_parent"
            android:layout_height="395dp"
            android:layout_alignParentBottom="true"
            android:columnWidth="100dp"
            android:gravity="center"
            android:numColumns="1"
            android:stretchMode="columnWidth"
            android:verticalSpacing="10dp" />
    </RelativeLayout>

    <ListView
        android:id="@+id/drawerList"
        android:background="#EEEEEE"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@null"
        android:dividerHeight="0dp" />

</android.support.v4.widget.DrawerLayout>

谢谢!

【问题讨论】:

  • onItemClick 被解雇了吗?
  • @MagicalPhoenixϡ 不,我不这么认为,因为我删除了所有代码并添加了 Toast:“Item Clicked!”它甚至没有去那里。也没有错误。网格视图只是一种“固体蔬菜”:/
  • 显示主网格视图的 xml
  • @MagicalPhoenixϡ 已编辑 :)
  • 检查适配器的areAllItemsEnabled和isEnabled是否返回了false?如果是,则返回 true

标签: android eclipse gridview onitemclicklistener clickable


【解决方案1】:

尝试将内容添加到另一个布局,然后像这样将该布局膨胀到网格视图。

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

                     View grid = convertView;
                     if (convertView == null) {

                     grid = inflater.inflate(R.layout.gridview_layout, parent, false);
                     } else {
                     grid = (View) convertView;
          }

        final Button bt = (Button) grid.findViewById(R.id.ready);
        final TextView tno=(TextView)grid.findViewById(R.id.txt);
        final TextView name=(TextView)grid.findViewById(R.id.txt3);
        final TextView qty=(TextView)grid.findViewById(R.id.txt4);
        final TextView instr=(TextView)grid.findViewById(R.id.txt5); 

        dish = data.get(position);

        tno.setText(dish.get(KEY_TNO));
        name.setText("NAME: "+dish.get(KEY_NAME));
        qty.setText("QTY:"+dish.get(KEY_QUANTITY));
        instr.setText("INSTRN: "+dish.get(KEY_INSTRUCTION));


        bt.setOnClickListener(new View.OnClickListener() {  

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String tn = tno.getText().toString();
                System.out.println("TABLE NO:"+tn);
                Toast.makeText(getApplicationContext(), "Successssss"+tn,    Toast.LENGTH_SHORT).show();


            }
        });

        return grid;
    }

【讨论】:

    【解决方案2】:

    当网格项目内的任何视图可点击时,不会触发 GridView onItemClick。我看到您的网格项目布局包含默认可点击的 Horizo​​ntalScrollView(这很有意义,当滚动视图不处理点击事件时,如何与滚动视图交互)。

    如果你想使用这样的布局,你必须处理网格项目级别的所有点击事件,而不是网格级别。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多