2012-02-03 128 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類中進行上述更改之後,列表中的每個項目都將單獨的實例保存到查看持有者對象。事情開始按預期工作。

教訓教訓 - 千萬不要做任何類的靜態,除非它是絕對必要的.... :) :)