Проблема макета строки в пользовательском списке Android - PullRequest
0 голосов
/ 03 февраля 2012

Я определил следующую раскладку, которая содержит TextView, CheckBox и ProgressBar.У меня есть два вопроса: -

  1. Когда я нажимаю на элемент списка, он автоматически сортируется по возрастанию по убыванию и наоборот, что может быть не так в моей реализации?

  2. Если я сохранил видимость Checkbox в 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();
}

}

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Я нашел ответ на следующий вопрос

Если я сохранил видимость Checkbox на true, то я не получаю событие onListItemClick ().

Ответ- Установите фокусировку Textview, флажок и индикатор выполнения, а также относительное расположение на false.

0 голосов
/ 06 февраля 2012

Также нашел ответ для # 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, каждый элемент в списке содержит отдельный экземпляр для просмотра объекта-держателя. И все стало работать как положено.

Извлеченный урок - Никогда не делайте класс статичным, если это не является абсолютно необходимым .... :):)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...