2012-02-03 91 views
0

我已经定义了以下包含TextView,CheckBox和ProgressBar的布局。我有两个问题: -Android自定义列表视图行布局问题

  1. 当我点击列表项,它自动从升序到降序,反之亦然,什么可能是错误的,我实现?

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

请在下面找到布局,我是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(); 
} 

}

+0

你的意思是,当你点击它是越来越排序?你的代码看起来如何?如果发生这种情况,它与代码而不是布局有关。你是如何在代码中对listview进行ifint的? – 2012-02-03 20:06:10

+0

您好coder_for_life22,添加了我正在使用的自定义适配器类。 – Omkar 2012-02-03 20:15:27

+0

当您点击一个项目时,您的列表项目正在重新排列? – 2012-02-03 20:23:33

回答

1

我已经找到了以下问题

的答案。如果我保持复选框的知名度,真正的那么我没有得到 onListItemClick()事件。

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

0

此外,还找到了#2的答案。

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

问题是因为我的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类中进行上述更改之后,列表中的每个项目都将单独的实例保存到查看持有者对象。事情开始按预期工作。

教训教训 - 千万不要做任何类的静态,除非它是绝对必要的.... :) :)