Android自定义列表视图行布局问题

时间:2012-02-03 19:59:22

标签: android android-layout

我定义了以下布局,其中包含TextView,CheckBox和ProgressBar。我有两个问题: -

  1. 当我点击列表项时,它会自动从Ascending排序到降序,反之亦然,我的实现可能出错?

  2. 如果我将Checkbox的可见性保持为true,那么我没有得到onListItemClick()事件。

  3. 请在下面找到布局,我是android的新手。

    <?xml version="1.0" encoding="utf-8"?>
    

    <TextView
        android:id="@+id/textUrl"
        android:layout_width="318dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="40dp"
        android:text="TextView" />
    
    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textUrl"
        android:layout_marginLeft="40dp" />
    
    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:text="CheckBox" />
    

    以下是我正在使用的自定义适配器类。

     public class CustomListViewAdapter extends ArrayAdapter<ListItemData>
    {
        Context mContext;
        int mlayoutResourceId;
    List<ListItemData> mlistData = null;
    
    public CustomListViewAdapter(Context context,List<ListItemData> objects) 
    {
        super(context, R.layout.custom_listview_row2, objects);
    
        mContext = context;
        mlistData = objects;
    }       
    
    @SuppressWarnings("static-access")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View v = convertView;
        ViewHolder vh;
        if (null == v)
        {
            LayoutInflater inflator = ((Activity)mContext).getLayoutInflater();
            v = inflator.inflate(R.layout.custom_listview_row2, parent,false);
            vh = new ViewHolder();
            vh.mUrlTextView = (TextView) v.findViewById(R.id.textUrl);
            vh.mProgressBar = (ProgressBar) v.findViewById(R.id.progressBar1);
            vh.mCheckBox = (CheckBox)v.findViewById(R.id.checkBox);
    
            v.setTag(vh);
        }
        else
        {
            vh = (ViewHolder)v.getTag();
        }
        ListItemData itemData = mlistData.get(position);
        vh.mUrlTextView.setText(itemData.mUrlName);
        vh.mProgressBar.setProgress(itemData.mProgressValue);
        return v;
    }   
    

    }

    ListActivity的代码

        public class CustomListViewActivity extends ListActivity 
    {
        //List<HashMap<String, Object>> fillList = new ArrayList<HashMap<String, Object>>();
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.custom_list_view);
            ArrayList<ListItemData> list = new ArrayList<ListItemData>();
    
            for (int idx = 0; idx < 10;idx++)
            {
            ListItemData item = new ListItemData("", 0);
            item.mUrlName = String.format("www.url-%d.com", idx);
            item.mProgressValue = idx*10;
            list.add(item);
        }       
        CustomListViewAdapter adapter = new CustomListViewAdapter(this,list);
        setListAdapter(adapter);
    }
    
    @Override   
    protected void onListItemClick(ListView l, View v, int position, long id) 
    {
        super.onListItemClick(l, v, position, id);
         ListItemData item = (ListItemData)getListAdapter().getItem(position);
         Toast.makeText(this, String.format("%s - %d", item.mUrlName,item.mProgressValue), Toast.LENGTH_LONG).show();
    }
    

    }

2 个答案:

答案 0 :(得分:1)

我找到了以下问题的答案

  

如果我将Checkbox的可见性保持为真,那么我没有得到   onListItemClick()事件。

答案 - 将Textview,复选框和进度条以及相对布局的焦点设置为false。

答案 1 :(得分:0)

还找到了#2的答案。

当我点击列表项时,它会自动从Ascending排序到降序,反之亦然,我的实现可能出错?

问题是因为我的ViewHolder类。这最初如下所示

    final class ViewHolder 
    {   
        public static TextView mUrlTextView;
        public static ProgressBar mProgressBar;
        public static CheckBox mCheckBox;
    }

当我按照以下方式更改时,事情开始正常工作:)

class ViewHolder 
{   
    public  TextView mUrlTextView;
    public  ProgressBar mProgressBar;
    public  CheckBox mCheckBox;
}

由于该类是静态的,因此标记值指向同一实例。现在,在ViewHolder类中进行上述更改之后,列表中的每个项目都包含单独的实例以查看持有者对象。事情开始按预期发挥作用。

获得的经验教训 - 除非绝对必要,否则永远不要让任何类静止.... :) :)。