【问题标题】:How to do multiselect functionality on grid view items on tap?如何在点击的网格视图项目中执行多选功能?
【发布时间】:2013-10-29 09:42:46
【问题描述】:

我已经制作了网格视图,我必须在其中选择多个项目。但我不想要长按功能。我只是希望单击即可选择多个项目。网格视图位于片段下。

这是我的片段类:

public class FragmentOrder extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        //View view = inflater.inflate(R.layout.g, null);
        View view = inflater.inflate(R.layout.gridview,null);
        final GridView listView = (GridView) view.findViewById(R.id.mainGrid);
        listView.setAdapter(new OrderGridViewAdapter(MainActivity.this));
        //int setSelected = 0;
        listView.setSelected(true);

        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                // TODO Auto-generated method stub

            }
        });
        return view;
    }
}    

这是我的适配器类:

public class OrderGridViewAdapter extends BaseAdapter{
    private Context MContext;

    public OrderGridViewAdapter(Context C){
        MContext = C;

    }


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

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

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

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


        View myView;


        LayoutInflater inflater = (LayoutInflater)MContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);           
        myView = inflater.inflate(R.layout.grid_items_ontap, null);


        // Add The Image!!!           
        ImageView iv = (ImageView)myView.findViewById(R.id.grid_item_image_OnTap);
        iv.setImageResource(mThumbIds[position]);


        // Add The Text!!!
        TextView tv = (TextView)myView.findViewById(R.id.grid_item_text_onTap);
        tv.setText(names[position] );




        return myView;
    }


    private Integer[] mThumbIds = {
            R.drawable.car, R.drawable.car,
            R.drawable.car, R.drawable.car,
            R.drawable.car,R.drawable.car,R.drawable.car,R.drawable.car, R.drawable.car,
            R.drawable.car, R.drawable.car,
            R.drawable.car,R.drawable.car,R.drawable.car
    };

    private String[] names={"ab","cd","ef","gh","ij","kl","mn","","","","","","",""};
 }

任何建议将不胜感激。 谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    这是您需要做的粗略解决方案:

    1) 维护一个包含当前选定项目位置的列表。

    private ArrayList<Integer> mSelected = new ArrayList<Integer>();
    

    当您单击项目(选择项目)时,将其添加到列表中。当您再次单击项目(取消选择项目)时,从列表中删除。

        public void onItemSelect(AdapterView<?> parent, View v, int pos, long id) {
            Integer position = new Integer(pos);
            if(mSelected.contains(position)) {
                mSelected.remove(position); // remove item from list
                // update view (v) state here
                // eg: remove highlight
            }
            else {
                mSelected.add(position); // add item to list
                // update view (v) state here
                // eg: add highlight
            } 
        }
    

    2)您必须更新视图,以显示是否选择了项目,我将添加代码(+cmets)在哪里执行此操作。

    3) 最后,列表将包含所有已选择的项目。

    这里的代码显示了上面代码的放置位置。

    代码:

    public class FragmentOrder extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            //View view = inflater.inflate(R.layout.g, null);
            View view = inflater.inflate(R.layout.gridview,null);
            final GridView listView = (GridView) view.findViewById(R.id.mainGrid);
            final OrderGridViewAdapter adapter = new OrderGridViewAdapter(MainActivity.this)
            listView.setAdapter(adapter);
            //int setSelected = 0;
            listView.setSelected(true);
    
            listView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                    adapter.onItemSelect(arg0, arg1, arg2, arg3);
                }
            });
            return view;
        }
    }
    

    适配器:

    public class OrderGridViewAdapter extends BaseAdapter{
        private Context MContext;
        private ArrayList<Integer> mSelected = new ArrayList<Integer>();
    
        public OrderGridViewAdapter(Context C){
            MContext = C;
        }
    
    
        @Override
        public int getCount() {
            return mThumbIds.length;
        }
    
        @Override
        public Object getItem(int position) {
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
    
        public void onItemSelect(AdapterView<?> parent, View v, int pos, long id) {
            Integer position = new Integer(pos);
            if(mSelected.contains(position)) {
                mSelected.remove(position);
                // update view (v) state here
                // eg: remove highlight
            }
            else {
                mSelected.add(position);
                // update view (v) state here
                // eg: add highlight
            } 
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
    
            View myView;
    
    
            LayoutInflater inflater = (LayoutInflater)MContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);           
            myView = inflater.inflate(R.layout.grid_items_ontap, null);
    
    
            // Add The Image!!!           
            ImageView iv = (ImageView)myView.findViewById(R.id.grid_item_image_OnTap);
            iv.setImageResource(mThumbIds[position]);
    
    
            // Add The Text!!!
            TextView tv = (TextView)myView.findViewById(R.id.grid_item_text_onTap);
            tv.setText(names[position] );
    
            // Set view highlight here, based on if it is selected or not.. 
            if(mSelected.contains(position)) { 
                // update view (v) state here
                // eg: add highlight
            }
            else {
                // update view (v) state here
                // eg: remove highlight
            }
    
    
            return myView;
        }
    
    
        private Integer[] mThumbIds = {
                R.drawable.car, R.drawable.car,
                R.drawable.car, R.drawable.car,
                R.drawable.car,R.drawable.car,R.drawable.car,R.drawable.car, R.drawable.car,
                R.drawable.car, R.drawable.car,
                R.drawable.car,R.drawable.car,R.drawable.car
        };
    
        private String[] names={"ab","cd","ef","gh","ij","kl","mn","","","","","","",""};
     }
    

    更新: 要更新视图,您应该阅读有关如何以编程方式更改视图属性的信息。例如,如果你想改变背景颜色:

    v.setBackgroundColor(Color.parseColor("#000000")); // change to black
    

    【讨论】:

    • 如何维护一个列表?
    • 是的,我已经看到了,但我怎么知道要更新包含所选项目位置的列表。正如你所说..?
    • 一件事我将如何更新视图,因为我正在做的任何事情都是从 xml 文件中更改所选项目的背景..?
    • 嘿,很抱歉,我无法理解您的意思。我已经更新了我的答案以更清楚。此外,stackoverflow 上的答案通常是关于如何解决问题的粗略指导。没有人会为你编写完整的代码..
    • 感谢您的帮助...:)
    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多