在ListView中滚动时CheckedTextView消失

时间:2015-02-25 08:52:06

标签: android android-listview custom-adapter checkedtextview

我有自定义ListView。我正在使用数组适配器来填充我的ListViews行。它工作得很好。当我选择ListView行时,我的checkedtextview变得可见。滚动我检查的情况后消失。 我怎么能记得我的支票?

谢谢你的帮助。

我的适配器

package test.cbsmobil.ibb;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.TextView;

import java.util.ArrayList;


public class ListViewItemsAdapter extends ArrayAdapter<Item> {

private Context context;
private ArrayList<Item> items;
private LayoutInflater vi;
private int resLayout;
private CheckedTextView ctv;
private int selectedIndex;


public ListViewItemsAdapter(Context context, ArrayList<Item> items) {
    super(context, 0, items);
    this.context = context;
    this.items = items;
    vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    selectedIndex = -1;

}




@Override
public long getItemId(int position) {

    return position;
}

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


    final Item i = items.get(position);
    if (i != null) {
        if (i.isSection()) {
            ListViewItemsSection si = (ListViewItemsSection) i;
            v = vi.inflate(R.layout.list_item_section, null);

            v.setOnClickListener(null);
            v.setOnLongClickListener(null);
            v.setLongClickable(false);

            final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
            sectionView.setText(si.getTitle());
        } else {

            ListViewItems ei = (ListViewItems) i;
            v = vi.inflate(R.layout.list_item_entry,null);

            final TextView title = (TextView) v.findViewById(R.id.list_item_entry_title);

            if (title != null)
                title.setText(ei.title);

        }
    }

    return v;

}


 }

这是我的MainActivity; 让我解释一下这个活动的代码块。 layerlist是我的ListView。我在ListView中使用选择模式倍数进行多项选择。

layerlist.setAdapter(adapter);
    layerlist.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    layerlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(!items.get(position).isSection()){


                    ListViewItems item = (ListViewItems) items.get(position);
                    //adapter.setSelectedIndex(position);
                    Log.d("ListView", "Position " + item.toString());
                    //View v = layerlist.getChildAt(position);
                    View v = getViewByPosition(position,layerlist);
                    CheckedTextView ctv = (CheckedTextView) v.findViewById(R.id.ctv);



                    if (!ctv.isChecked()) {
                        ctv.setChecked(true);
                        Log.d("Checked", "Açıldı" + " " + ctv.isChecked());

                    } else {
                        ctv.setChecked(false);
                        Log.d("Checked", "Kapandı" + " " + ctv.isChecked());
                    }


           }
        }
    });



    return rootView;
}

private View getViewByPosition(int pos, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition ) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

3 个答案:

答案 0 :(得分:1)

您应该使用&#34;视图持有者&#34; developer.android.com描述的设计模式,并详细解释了this post

最重要的是:

  1. 创建ViewHolder类;
  2. 如果convertView为null,则将ViewHolder实例存储在标记中;
  3. 如果不是,请从标记恢复ViewHolder实例。
  4. 这是我的适配器代码:

    package br.com.inovant.pm;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.*;
    
    import java.util.List;
    
    public class ContactsAdapter extends ArrayAdapter<CheckedContact>{
    
        public ContactsAdapter(Context context, List<CheckedContact> contacts) {
            super(context, 0, contacts);
        }
    
        static class ViewHolder {
            protected CheckedTextView checkedTextView;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.select_dialog_multichoice, parent, false);
                viewHolder = new ViewHolder();
                viewHolder.checkedTextView = (CheckedTextView) convertView.findViewById(android.R.id.text1);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
            final CheckedContact checkedContact = getItem(position);
    
            final CheckedTextView checkedTextView = viewHolder.checkedTextView;
            checkedTextView.setText(checkedContact.getContact().getDisplayName());
            checkedTextView.setChecked(checkedContact.isChecked());
            return convertView;
        }
    
        @Override
        public long getItemId(int position) {
            return getItem(position).getContact().getId().hashCode();
        }
    
        @Override
        public boolean hasStableIds() {
            return true;
        }
    }
    

答案 1 :(得分:0)

我遇到了同样的问题,我在自定义适配器中使用了以下方法,我得到了解决方案。

在ListViewItemsAdapter中添加以下方法:

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

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount() {

        return getCount();
    }

尝试一下,你也会得到解决方案。

答案 2 :(得分:0)

Android的ListView会回收其所有单独的视图,也就是说,当列表项滚动离开屏幕时,其视图将被回收以供刚刚滚动到可见屏幕区域的视图使用。现在,当一个旧的列表项滚动回到视图中时,它会获得一些其他回收视图来绘制自己。 因此,复选标记丢失或任何已更改/更新的数据。

对此的解决方案是将更改保存在列表项中,在您的情况下 - ListViewItems。假设您在ListViewItems的类定义中有一个标志boolean isChecked = false,并且在您调用setChecked方法的onItemClick中,设置isChecked = true 这将有助于您坚持使用复选标记。

希望它有所帮助。