Android - Gridview, custom layout onclicklistener

Deadly 提交于 2020-01-03 02:27:23

问题


I have a GridView with two TextViews inside it, When the GridView is populated, an OnClickListener is set which returns the position of the item that was selected. I want to trigger a method when one of the TextViews is selected.

Is this possible? If yes, how do I set this up?

EDIT 3:

Inside my activity whch populated the GridView: I retrieve a String-Array from my Strings.xml, a for loop examines each item inside the Array and searches for a condition based on the Item's name inside the SharedPreferences, this for loop is solely for counting how many "true" conditions there are, so it retrieves a int saved inside the count. Then a new String[] is created, this required an exact length to be given before items can be added to it, so I check count if it's more than 0, it will give the String[] a length of count and then another for loop will add each true to the String[] list that we just created. If count is 0 (no true conditions found in the first for loop) then only 1 Item is added to the String[] and is given the value "No Favourites Added".

Then you have the GridView's 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);
            }
        });

So that's the code inside the Activity which populates the GridView. The Adapter in it's original, functioning form: This simply populates the GridView with Favourite Items (their names from the String[]) and adds a TextView with "Remove" which when pressed, shows a 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;
    }
}

回答1:


I am assuming that you are using a custom adapter for populating this GridView, and passing the Context as an argument to the constructor.

In the custom adapter, you should add onClickListeners to the TextViews. Using the context, you can call methods from your activity:

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

This would go inside the onClickListeners.

Edit: Added some code:

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;
    }

}

So, CallingActivityName is the name of the Activity where you initiate the adapter and where the method you need to call resides. info is the object held at position position of the gridview. MyObjectClass is the class name of the objects in the List mEntries.



来源:https://stackoverflow.com/questions/17707154/android-gridview-custom-layout-onclicklistener

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!