【问题标题】:How to modify only one row at a time in Listview?如何在 Listview 中一次只修改一行?
【发布时间】:2014-05-16 00:02:50
【问题描述】:

我正在尝试找出以下所列问题的解决方案。我有一个使用Simpleadapter 生成的Listview。当我单击列表视图中的一行时,我想创建一个 id colorful 的布局可见。我能够做到这一点。但我的问题从这里开始。当我点击另一行说第 5 行时,彩色布局是可见的,但之前点击的行的布局也是可见的。我想要做的是使布局彩色仅对单击的行可见(即一次应该只对一行可见,即当前单击的行并隐藏所有剩余的行),并且布局应该变得不可见以前单击的行。我尝试使用viewholder,但它没有帮助。我的代码 sn-p 如下。一步一步指导我,因为我对 Android 还很陌生。

           final BaseAdapter k=new SimpleAdapter(getActivity(),val,R.layout.mytaskdata,new String[]{"sname","heading","desc","id","path","receiver","sender"},new int[]{R.id.textView1,R.id.textView2,R.id.textView3,R.id.hide1,R.id.hide2,R.id.hide3,R.id.hide4})
      {

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            final View v = super.getView(position, convertView, parent);
            TextView myname=(TextView)v.findViewById(R.id.textView1);
            TextView mydes=(TextView)v.findViewById(R.id.textView2);
            TextView mytopic=(TextView)v.findViewById(R.id.textView3);
            ImageView edit=(ImageView)v.findViewById(R.id.ImageView03);
            sent.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                    RelativeLayout r=(RelativeLayout)arg1.findViewById(R.id.colorful);
                //  r.setVisibility(arg1.VISIBLE);
                    int temp=sent.getCheckedItemPosition();
                    Log.i("itemposition",""+temp);

                    Toast.makeText(getActivity(),"pos"+arg2+"hii"+positionThatSaysHi,1000).show();
                    if(arg2!=positionThatSaysHi)
                    {
                        r.setVisibility(arg1.VISIBLE);
                        positionThatSaysHi = arg2;
                        notifyDataSetChanged();
                    }
                    else
                    {
                        r.setVisibility(arg1.GONE);
                         notifyDataSetChanged();
                    }
            });

【问题讨论】:

    标签: android listview simpleadapter


    【解决方案1】:

    我建议修改OnClickListener 以仅记录选定的行,然后调用notifyDataSetChanged()。这将导致 ListView 通过调用适配器重绘其项目。因此,您只需检查getView() 中的这个值,以确定“彩色”视图是否应该可见。

    所以更新后的代码会是这样的:

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        final View v = super.getView(position, convertView, parent);
        TextView myname=(TextView)v.findViewById(R.id.textView1);
        TextView mydes=(TextView)v.findViewById(R.id.textView2);
        TextView mytopic=(TextView)v.findViewById(R.id.textView3);
        ImageView edit=(ImageView)v.findViewById(R.id.ImageView03);
    
        RelativeLayout r = (RelativeLayout)v.findViewById(R.id.colorful)            
        r.setVisibility(position == positionThatSaysHi ? View.VISIBLE : View.GONE);
    
        sent.setOnItemClickListener(new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
            {
                positionThatSaysHi = arg2;
                notifyDataSetChanged();
            }
        });
    }
    

    这样,您可以确保只突出显示一个视图(同时也简化了您的代码)。

    【讨论】:

      【解决方案2】:

      利用 ListView 中的选择模式(请参阅setChoiceMode()),并将其设置为 CHOICE_MODE_SINGLE。

      使用选择状态来切换彩色布局的可见性。如果可能,最简单的方法是在选择器中绘制彩色位,selected=true。这样它将自动显示,您不必担心隐藏和显示视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 1970-01-01
        • 2020-04-11
        • 2017-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多