Глобальная переменная Android и пользовательский адаптер - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть список с двумя текстовыми представлениями в виде столбцов. Я использую собственный адаптер для управления адаптером.

public class MyCustomBaseAdapter extends BaseAdapter {
 private static ArrayList<SearchResults> searchArrayList;

 private LayoutInflater mInflater;

 public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
  searchArrayList = results;
  mInflater = LayoutInflater.from(context);
 }

 public int getCount() {
  return searchArrayList.size();
 }

 public Object getItem(int position) {
  return searchArrayList.get(position);
 }

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

 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView == null) {
   convertView = mInflater.inflate(R.layout.row, null);
   holder = new ViewHolder();

   holder.txtName = (TextView) convertView.findViewById(R.id.left);
   holder.txtCityState = (TextView) convertView.findViewById(R.id.right);

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

  holder.txtName.setText(searchArrayList.get(position).getName());
  holder.txtCityState.setText(searchArrayList.get(position).getCityState());

  return convertView;
 }

 static class ViewHolder {
  TextView txtName;
  TextView txtCityState;

 }
}

Я использовал глобальные переменные для изменения макета списка. Как видите, для txtName задано «левое» текстовое представление, а для txtCityState задано правое текстовое представление.

В упражнении я устанавливаю глобальную переменную равной 0 или 1 в зависимости от нажатия пользователем кнопки 01 или Button02:

 final Button sortdate = (Button)findViewById(R.id.Button01);
      sortdate.setOnClickListener(new View.OnClickListener() 
  {
    public void onClick(View v) 
    {
    //  lv1.setAdapter(simpleAdapter);
        GlobalVars.setEset(0);  
      //Toast.makeText(MainActivity.this, String.valueOf(GlobalVars.getEset()), Toast.LENGTH_SHORT).show(); 
    }
  });
      final Button sortname = (Button)findViewById(R.id.Button02);
      sortname.setOnClickListener(new View.OnClickListener() 
  {
    public void onClick(View v) 
    {
        GlobalVars.setEset(1);  
      //Toast.makeText(MainActivity.this, String.valueOf(GlobalVars.getEset()), Toast.LENGTH_SHORT).show(); 

    }
  });

Переменная, кажется, установлена, так как сообщение Toast показывает 0 или 1, если я нажимаю кнопки.

В моем MyCustomBaseAdapter я пытаюсь изменить макет следующим образом:

 if (GlobalVars.getEset() == 0)
   {

   holder.txtName = (TextView) convertView.findViewById(R.id.left);
   holder.txtCityState = (TextView) convertView.findViewById(R.id.right);
   }
   else if (GlobalVars.getEset() == 1)
   {
       holder.txtName = (TextView) convertView.findViewById(R.id.right);
       holder.txtCityState = (TextView) convertView.findViewById(R.id.left);
   }

но ничего не происходит. Что может быть не так с этим? Все остальное работает нормально.

Должно быть проще использовать другое представление адаптера с другим файлом row.xml. В другом файле row.xml я бы установил другую ширину для текстовых представлений, чтобы это было простым решением, но есть проблема со строкой lv1.setAdapter ....

  final Button sortname = (Button)findViewById(R.id.Button02);
      sortname.setOnClickListener(new View.OnClickListener() 
      {
        public void onClick(View v) 
        {
            GlobalVars.setEset(1);
            ArrayList<SearchResults> searchResults = GetSearchResults();
            lv1 = (ListView) findViewById(R.id.ListView01);
            lv1.setAdapter(new MyCustomBaseAdapter2(this, searchResults));
        }
      });

Как вы видите, это относится к MyCustomBaseAdapter2.java. Но проблема в том, что «конструктор MyCustomBaseAdapter2 (новый View.OnClickListener () {}, ArrayList) не определен». Это также происходит, когда речь идет о MyCustomBaseAdapter.java здесь. Из кнопки слушатель работает нормально.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2011

Я бы сделал все наоборот:

В держателе вместо того, чтобы называть поля как txtName и txtCityState, назовите их txtLeft и txtRight.

Затем переместите оператор if, который выбирает, какое поле и в какое текстовое представление переходит в метод getView

public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView == null) {
   convertView = mInflater.inflate(R.layout.row, null);
   holder = new ViewHolder();

   holder.txtLeft = (TextView) convertView.findViewById(R.id.left);
   holder.txtRight = (TextView) convertView.findViewById(R.id.right);

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

  String leftText;
  String rightText;

   if (GlobalVars.getEset() == 0)
   {

       leftText  = searchArrayList.get(position).getName();
       rightText = searchArrayList.get(position).getCityState()

   }
   else if (GlobalVars.getEset() == 1)
   {
       rightText = searchArrayList.get(position).getName();
       leftText  = searchArrayList.get(position).getCityState()
   }

  holder.txtLeft.setText(leftText);
  holder.txtRight.setText(rightText);

  return convertView;
 }

Другое дело: когда пользователь нажимает одну из этих кнопок, вызовите Adatper.notifyDataSetChanged()

0 голосов
/ 19 февраля 2011

Кажется, что ваш ViewHolder просто хранится внутри convertView с convertView.setTag(holder), но не влияет на макет convertView.

Единственная строка (по крайней мере в показанном коде), которая влияет на convertView:

convertView = mInflater.inflate(R.layout.row, null);

После этого convertView нигде не изменяется.

Обновление:

View.setTag(object) используется только для хранения некоторых справочных данных и не меняет компоновку вида.

...