【问题标题】:Android - Gridview, custom layout onclicklistenerAndroid - Gridview,自定义布局onclicklistener
【发布时间】:2013-07-17 18:11:47
【问题描述】:

我有一个 GridView,里面有两个 TextView,当填充 GridView 时,会设置一个 OnClickListener,它返回所选项目的位置。我想在选择其中一个 TextView 时触发一个方法。

这可能吗?如果是,我该如何设置?

编辑 3

在填充 GridView 的活动中:我从 Strings.xml 中检索 String-Arrayfor loop 检查 Array 中的每个项目并根据 SharedPreferences 中的项目名称搜索条件,此 @987654324 @ 仅用于计算有多少“真实”条件,因此它检索保存在 count 中的 int。然后创建一个新的String[],这需要在添加项目之前给出一个确切的长度,所以我检查count,如果它大于0,它会给String[]一个长度count然后另一个for loop 会将每个true 添加到我们刚刚创建的String[] 列表中。如果 count 为 0(在第一个 for loop 中没有找到真正的条件),则只有 1 个项目被添加到 String[] 并被赋予值“未添加收藏夹”。

然后你就有了 GridView 的 OnItemClickListener()。

        String s[] = getResources().getStringArray(R.array.FullList);
        int count = 0;
        for(int i = 0; i < s.length; i++) {
            SharedPreferences sP = getActivity().getSharedPreferences("fav", MODE_PRIVATE);
            Boolean b = sP.getBoolean(s[i], false);
            if (b == true) {
                count++;
            }
        }
        String[] newList;
        if (count > 0) {
            newList = new String[count];
            count = 0;
            for(int i = 0; i < s.length; i++) {
                SharedPreferences sP = getActivity().getSharedPreferences("fav", MODE_PRIVATE);
                Boolean b = sP.getBoolean(s[i], false);
                if (b == true) {
                    newList[count] = s[i];
                    count++;
                }
            }
        } else {
            newList = new String[1];
            newList[0] = "No favourites added";
        }

        GridView FavGV = (GridView) getActivity().findViewById(R.id.sexp_fav);
        FavGV.setAdapter(new Tab01_FavAdapter(getActivity(), newList));
        FavGV.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView arg0, 
                    View arg1, int position, long arg3) {

                //Intent i = new Intent(getActivity(), PosPreview_Gestures.class);
                //i.putExtra("position", position);
                //startActivity(i);
            }
        });

这就是填充 GridView 的 Activity 中的代码。适配器的原始功能形式:这只是用最喜欢的项目(它们的名称来自 String[])填充 GridView,并添加一个带有“Remove”的 TextView,当按下它时,会显示一个 Toast:“Remove”。

public class Tab01_FavAdapter extends BaseAdapter {

    private Context mContext;
    private LayoutInflater mInflator;

    String mEntries[];     
    public Tab01_FavAdapter (Context c, String[] entries) {
        mContext = c;
        mInflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mEntries = entries; 
    }

    @Override
    public int getCount() {
        return mEntries.length;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        if(convertView == null) {
            convertView = mInflator.inflate(R.layout.favitemlayout, parent, false);
        }

        TextView tx = (TextView) convertView.findViewById(R.id.favgridremoveitem);
        OnClickListener oCL = new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext,"Remove",Toast.LENGTH_SHORT).show();
            }
        };
        tx.setOnClickListener(oCL);

        return convertView;
    }
}

【问题讨论】:

  • 我在答案中添加了一些代码。如果代码中的某些内容不清楚,请随时询问。
  • 我有几个问题要问你。你能解释一下 Grid 项目包含什么吗?你在哪里使用String 数组s?在final MyObjectClass info = mEntries.get(position); 行中,您需要将MyObjectClass 更改为String 并将mEntries 更改为s。此外,在重写的getItem(int position) 方法中,将return position; 替换为return s[position]
  • 您还需要静态 ViewHolder 类。在String s[]; 之后粘贴public static class ViewHolder { public TextView tx; }。可以发一下布局文件R.layout.favitemlayout吗?
  • GridView 包含收藏项列表。这些项目在 s 数组中。在 Activity 内部创建 GridView 适配器时,它会将 s 数组传递给适配器的构造函数。编辑:gridview 中的每个项目都将具有收藏夹的名称和一个显示“删除”的 TextView。按下名称时,它会打开项目 - 这是我的 Activity 中的 GridView onClickListener。当按下 Remove 时,它​​会检索 GridView 项目的项目名称/位置,并调用 favRemove() 来处理该信息并从列表中删除该项目。
  • 请参阅上面的编辑 3。这是我的原始代码,并解释了它的作用。我需要它来列出我最喜欢的项目,每个项目都有自己的删除按钮 (TextView),当按下该按钮时,它会调用 favRemove(String itemName, int itemPos)。然而,如果 Item 本身被按下(而不是里面的 Remove 按钮),我希望它触发 OnItemClickListener:正如您在上面的 Edit 3 代码中看到的那样,这已经设置好了。如果你能让这部分发挥作用,我会从那里拿走它:)

标签: android android-gridview


【解决方案1】:

我假设您使用自定义适配器来填充此GridView,并将Context 作为参数传递给构造函数。

在自定义适配器中,您应该将onClickListeners 添加到TextViews。使用上下文,您可以从您的活动中调用方法:

((CallingActivityName)context).methodYouWishToCall(parameters);

这将进入onClickListeners

编辑:添加了一些代码:

public class MyGridAdapter extends BaseAdapter {

    private final List<MyObjectClass> mEntries;
    private final LayoutInflater mInflater;
    private final Context mContext; 

    public static class ViewHolder {
        public TextView tx;
    }

    public MyGridAdapter(CallingActivityName context, List<MyObjectClass> entries) {
        super();
        mEntries = entries;
        mContext = context;
        mInflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return mEntries.size();
    }

    @Override
    public Object getItem(int position) {
        return mEntries.get(position);
    }

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

        final ViewHolder holder;

        if (convertView == null) {

            convertView = mInflator.inflate(R.layout.favitemlayout, parent, false);
            holder = new ViewHolder();

            holder.tx = (TextView) convertView
                .findViewById(R.id.favgridremoveitem);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final MyObjectClass info = mEntries.get(position);

        holder.tx.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        ((CallingActivityName)mContext).favRemove(info);
                        notifyDataSetChanged();
                    }
        });

        return convertView;
    }

}

所以,CallingActivityName 是您启动适配器的 Activity 的名称以及您需要调用的方法所在的位置。 info 是位于网格视图的 position 位置的对象。 MyObjectClass 是 List mEntries 中对象的类名。

【讨论】:

  • 请参阅上面的编辑 :)
  • 我有一个小问题。我想要它,以便当单击 GridView 的项目时,它会触发 onItemClickListener,但是当单击项目的 textview 时,它会触发您设计的这个方法。这是适配器,我试图将您的代码嵌入其中,但我迷路了。请参阅上面的编辑 2。到目前为止,我只添加了 getView() 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2014-06-25
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多