簡體   English   中英

如何在Listview中一次只修改一行?

[英]How to modify only one row at a time in Listview?

我正在嘗試找出以下所列問題的解決方案。 我有一個使用Simpleadapter生成的Listview 當我單擊列表視圖中的一行時,我想創建一個ID為可見的colorful版式。 我能夠做到這一點。 但是我的問題從這里開始。 當我單擊另一行時,說出第5行,則可以看到彩色布局,但是對於先前單擊的行,該布局也可見。 我想做的是使布局僅對單擊的行可見(即,一次只能對一行顯示,即當前單擊的行對所有其余行都隱藏),並且布局對於先前點擊的行。 我嘗試使用viewholder但這沒有幫助。 我的代碼段如下。 逐步引導我,因為我是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();
                    }
            });

我建議將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();
        }
    });
}

這樣,您可以確保僅突出顯示一個視圖(同時還可以簡化代碼)。

利用ListView中的選擇模式(請參閱setChoiceMode() ),並將其設置為CHOICE_MODE_SINGLE。

使用選擇狀態可以切換彩色布局的可見性。 如果可能,最簡單的方法是使選擇器中的彩色位處於可繪制狀態,並且selected = true。 這樣,它將自動顯示,而您不必擔心隱藏和顯示視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM