Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GridView自定义,如何选择单个项目_Android_Gridview - Fatal编程技术网

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

Android GridView自定义,如何选择单个项目,android,gridview,Android,Gridview,在我的应用程序中,我自定义了gridview以显示标题和子项。但我无法选择单个项目。我的代码如下 主要活动 public class MainActivity extends Activity { private TextView tv; private GridView gv; private GridAdapter ga; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sav

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

主要活动

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;
    }
}
}
package com.example.testapplication;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类GridAdapter扩展ArrayAdapter{
专用布局器m_vi=空;
私有GridAdapter.Item m_Item=null;
private ViewHolderItem m_holderItem=null;
公共GridAdapter(上下文){
超级(上下文,0);
m_vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
m_item=(GridAdapter.item)getItem(position);
if(convertView==null | |!convertView.getTag().equals(m_holderItem)){
convertView=m_vi.充气(R.layout.mygrid,null);
m_holderItem=新视图holderItem();
setTag(m_holderItem);
}
否则{
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());
返回视图;
}
公共静态类ViewHolderItem{
公共文本视图标题;
公共文本视图TVTItem1;
公共文本视图项目2;
公共文本视图项目3;
}
公共静态类项{
公共字符串头,Item1,Item2,Item3;
公共项目(){
此.Header=“”;
本条第1款=”;
本条第2款=”;
本条第3款=”;
}
公共无效集(字符串头\u i、字符串项1\u i、字符串项2\u i、字符串项3\u i){
this.Header=Header\u i;
this.Item1=Item1_i;
this.Item2=Item2_i;
this.Item3=Item3_i;
}
公共字符串getHeader(){
返回此.Header;
}
公共字符串getItem1(){
返回此项。第1项;
}
公共字符串getItem2(){
返回此项。第2项;
}
公共字符串getItem3(){
返回此项。第3项;
}
}
}
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>

呈现形象

我只想要下面这样的o/p


只选择item2-2

因为您想要选择的项目不是不同的gridview项目,而是gridview项目的子项,我相信您唯一的选择是为您在getView方法中添加的每个textview设置onClickListeners,并编写自己的代码来着色“选定”textview的背景,将上一个文本视图恢复为正常颜色等

它还需要相当好地理解适配器视图是如何回收的,等等

编辑:概述如何完成此任务:

这是一项事业。我能为您发布的最好内容是一个很好的提纲:

  • setOnClickListener,用于希望捕获单击的每个视图。这些将是您在GetView方法中添加的特定文本视图

  • 执行任何您希望以图形方式指示视图已选中的操作。(例如黄色背景)

  • 记录所选视图的位置

  • 查找以前选定的视图,并根据需要删除图形选择

  • 因为视图被循环使用,所以无论您对“所选”视图以图形方式执行什么操作,如果每次调用getView时都没有检查和删除图形元素,则在滚动时可能会开始出现在其他视图上;当用户回滚时,还需要重新应用它们


  • 是的,你能用一些例子解释一下吗?我能提供的最好的例子是上面的大致轮廓。视图回收是您需要注意的最大陷阱。