显示ListView TextView基于计数表现奇怪

时间:2011-12-12 04:28:53

标签: android android-layout android-listview

我有一个使用自定义适配器填充项目集合的ListView。该集合的一个属性是计数,我的ListView布局中有两个TextView,一个用于文本,一个用于计数。如果计数为零,我不想显示计数TextView。最初加载ListView时,我的代码工作正常,但是当我滚动ListView时,计数将显示在随机行上,并且如果向上和向下滚动ListView,则会不断更改。这是我的代码:

    public class Main extends ListActivity
    {
         private static CustomAdapter adapter = null;


    @Override
    public void onCreate(Bundle icicle) 
    {  
            List<Item> items = new ArrayList<Item>();
        items = GetItems();
            adapter = new CustomAdapter();

            for (Item item : items)
                adapter.addItem(item);

            this.setListAdapter(adapter);

    adapter.notifyDataSetChanged();
    }

      /* ADAPTER */
 private class CustomAdapter extends BaseAdapter 
      {      
    private final List<Item> mData = new ArrayList<Item>();
    private final LayoutInflater mInflater;
    public CustomAdapter() {
        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(Item item) {
        mData.add(item);
    }

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

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        final ViewHolder holder;
        final Item item = (Item)this.getItem(position);

        if (convertView == null)
        {
            holder = new ViewHolder();

            convertView = mInflater.inflate(R.layout.main, parent, false);

            holder.text = (TextView)convertView.findViewById(R.id.text);
            holder.count = (TextView)convertView.findViewById(R.id.count);

            convertView.setTag(holder);
        } 
        else 
        {
                 holder = (ViewHolder)convertView.getTag();
        }

            holder.text.setText(item.getTitle());

            if (item.getCount() > 0)
                 holder.count.setText(item.getCount().ToString());
            else
                holder.count.setVisibility(View.INVISIBLE); 


        return(convertView);
    }
}

static class ViewHolder {
    TextView text, count
}

布局:

<TextView 
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true" 
/>

<TextView 
    android:id="@+id/count"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true" 

/>

编辑:

我能够通过做一个hacky解决方法来实现它。似乎将TextView的可见性设置为Invisible或Gone导致了问题,所以我只是将项目的颜色改为零计数到背景颜色:

            if (item.getCount() > 0)
                 holder.count.setText(item.getCount().ToString());
            else
                holder.count.setTextColor(Color.WHITE);

如果有人有真正的解决方法,请告诉我。

3 个答案:

答案 0 :(得分:3)

你应该这样做:

if (item.getCount() > 0) {
   holder.count.setText(item.getCount().ToString());
   holder.count.setVisibility(View.VISIBLE); 
}
else
   holder.count.setVisibility(View.INVISIBLE); 

因为您使用ViewHolder,所以您需要考虑这样一个事实:您可能会得到一个未显示View的旧版count。这意味着我们需要确保count的可见性设置为VISIBLE。同样,如果计数为零,我们希望隐藏它 - 所以我们改变了可见性,即使我们可能得到一个已经准备好不可见的View

答案 1 :(得分:2)

我认为你错了代码的一部分,修改测试这段代码:

if (item.getCount() > 0)
    holder.count.setText(item.getCount());
else
    holder.count.setVisibility(View.INVISIBLE);

答案 2 :(得分:0)

请仔细阅读此代码,您可能会对此有所帮助。

@Override

    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select);

        mListUsers = getUsers();
        lvUsers = (ListView) findViewById(R.id.lv_user);
        s = new ListAdapter(this, R.id.lv_user, mListUsers);
        lvUsers.setAdapter(s);    
        lvUsers.setClickable(true);

       // lvUsers.setTextFilterEnabled(true);

       lvUsers.setOnItemClickListener(new OnItemClickListener() {

        @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) 
        {
         Object o = lvUsers.getItemAtPosition(position);
             UserBO obj = (UserBO) o;
             Intent intent = new Intent(Select.this,Update.class);
              intent.putExtra("pid", ""+obj.getId());
              intent.putExtra("name", obj.getName());
              //put data which you want to show and select.

              startActivity(intent);
        }

    });

}

    public ArrayList<UserBO> getUsers()
    {               

        DBAdapter dbAdapter=DBAdapter.getDBAdapterInstance(this);
        try {
            dbAdapter.createDataBase();
        } catch (IOException e) {
            //Log.i("*** select ",e.getMessage());
        }
        dbAdapter.openDataBase();       
        String query="SELECT * FROM profiledatabase";
        ArrayList<ArrayList<String>> stringList = dbAdapter.selectRecordsFromDBList(query, null);
        dbAdapter.close();

        ArrayList<UserBO> usersList = new ArrayList<UserBO>();
        for (int i = 0; i < stringList.size(); i++) {
            ArrayList<String> list = stringList.get(i);
            UserBO user = new UserBO();
            try {
                user.pid = Integer.parseInt(list.get(0));
                //write code to get data from table

            } catch (Exception e) {
                //Log.i("***" + Select.class.toString(), e.getMessage());
            }
            usersList.add(user);
        }
        return usersList;
    }


 // ***ListAdapter***
    private class ListAdapter extends ArrayAdapter<UserBO>  {  
 // --CloneChangeRequired
        private ArrayList<UserBO> mList;  
 // --CloneChangeRequired
    public ListAdapter(Context context, int textViewResourceId,ArrayList<UserBO> list)               { 
 // --CloneChangeRequired
            super(context, textViewResourceId, list);
            this.mList = list;
        }

        public View getView(int position, View convertView, ViewGroup parent){
            View view = convertView;
        try
           {
            if (view == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = vi.inflate(R.layout.list_item, null); 
                // --CloneChangeRequired(list_item)
            }
            final UserBO listItem = mList.get(position);
                // --CloneChangeRequired                
            if (listItem != null)
            {
                // setting list_item views                      
                //( (TextView) view.findViewById(R.id.tv_pid) ).setText( listItem.getId()+"");
                ( (TextView) view.findViewById(R.id.tv_name) ).setText( listItem.getName() );
                ( (TextView) view.findViewById(R.id.tv_email)).setText(listItem.getEmail());
                ( (TextView) view.findViewById(R.id.tv_contact) ).setText( listItem.getContact()+"" );

            }}catch(Exception e)
            {
                //Log.i(Select.ListAdapter.class.toString(), e.getMessage());       
            }
            return view;
        }
    }