GridView自定义,如何选择单个项目

时间:2014-02-17 05:27:36

标签: android gridview

在我的应用程序中,我自定义gridview以显示标题和子项目。但我无法选择单个项目。我的代码如下

main_activity

public class MainActivity extends Activity {
private TextView tv;
private GridView gv;
private GridAdapter ga;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = (TextView)findViewById(R.id.TextMsg);
    gv = (GridView)findViewById(R.id.gridView);
    ga = new GridAdapter(this);
    gv.setAdapter(ga);

    GridAdapter.Item item = new GridAdapter.Item();
    item.set("Header1", "Item1_1", "Item1_2", "Item1_3");
    ga.add(item);

    item = new GridAdapter.Item();
    item.set("Header2", "Item2_1", "Item2_2", "Item2_3");
    ga.add(item);

    item = new GridAdapter.Item();
    item.set("Header3", "Item3_1", "Item3_2", "Item3_3");
    ga.add(item);
   }
  }

GridAdapter.java

package com.example.testapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class GridAdapter extends ArrayAdapter<GridAdapter.Item> {
private LayoutInflater m_vi = null;
private GridAdapter.Item m_item = null;
private ViewHolderItem m_holderItem = null;

public GridAdapter(Context context) {
    super(context, 0);
    m_vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    m_item = (GridAdapter.Item)getItem(position);
    if (convertView == null || !convertView.getTag().equals(m_holderItem)){
        convertView = m_vi.inflate(R.layout.mygrid, null);
        m_holderItem = new ViewHolderItem();
        convertView.setTag(m_holderItem);
    }
    else {
        m_holderItem = (ViewHolderItem) convertView.getTag();
    }

    m_holderItem.tvHeader = (TextView)convertView.findViewById(R.id.gridhead);
    m_holderItem.tvItem1 = (TextView) convertView.findViewById(R.id.gridtext1);
    m_holderItem.tvItem2 = (TextView) convertView.findViewById(R.id.gridtext2);
    m_holderItem.tvItem3 = (TextView) convertView.findViewById(R.id.gridtext3);
    m_holderItem.tvHeader.setText(m_item.getHeader());
    m_holderItem.tvItem1.setText(m_item.getItem1());
    m_holderItem.tvItem2.setText(m_item.getItem2());
    m_holderItem.tvItem3.setText(m_item.getItem3());
    return convertView;
}

public static class ViewHolderItem {
    public TextView tvHeader;
    public TextView tvItem1;
    public TextView tvItem2;
    public TextView tvItem3;
}

public static class Item {
    public String Header, Item1, Item2, Item3;

    public Item(){
        this.Header = "";
        this.Item1 = "";
        this.Item2 = "";
        this.Item3 = "";
    }

    public void set(String Header_i, String Item1_i, String Item2_i, String Item3_i) {
        this.Header = Header_i;
        this.Item1 = Item1_i;
        this.Item2 = Item2_i;
        this.Item3 = Item3_i;
    }

    public String getHeader(){
        return this.Header;
    }

    public String getItem1(){
        return this.Item1;
    }

    public String getItem2(){
        return this.Item2;
    }

    public String getItem3(){
        return this.Item3;
    }
}
}

mygrid-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">

 <TextView
    android:id="@+id/gridhead"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /> 

 <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/gridtext1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <View
        android:layout_width="20dp"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/gridtext2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <View
        android:layout_width="20dp"
        android:layout_height="wrap_content" />        

    <TextView
        android:id="@+id/gridtext3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />        

</LinearLayout>

<View
    android:layout_width="wrap_content"
    android:layout_height="5dp" 
/>

   </LinearLayout>

现在的形象;

enter image description here

我只想要o / p就像下面的

enter image description here 仅选择item2-2

1 个答案:

答案 0 :(得分:2)

由于您想要选择的项目不是不同的gridview项目,而是gridview项目的子项,我相信您唯一的选择是为您在getView方法中添加的每个textView设置onClickListener,并编写自己的着色代码“选定”文本视图的背景,将先前的文本视图返回到正常颜色等。

还需要很好地理解适配器视图的回收方式等。

编辑:概述如何实现这一目标:

这是一项承诺。我能为你发布的最佳内容是一个很好的概述:

  1. 您希望捕获点击的每个View的setOnClickListener。这些将是您在GetView方法中添加的特定TextView。

  2. 执行任何操作,以图形方式指示视图已选中。 (例如黄色背景)。

  3. 记录所选视图的位置。

  4. 查找上一个选定的视图,并根据需要删除图形选择。

  5. 因为视图得到回收,无论你以图形方式为“选定”视图做什么,如果在每次调用getView时都没有检查和删除图形元素,滚动时可能会开始出现在其他视图上;当用户向后滚动时,还需要重新应用它们。

相关问题