Android全局变量和自定义适配器

时间:2011-02-19 11:13:06

标签: android adapter

我有一个列表视图,其中包含两个textview作为列。 我正在使用自定义适配器来管理适配器。

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;

 }
}

我使用全局变量来更改listview的布局。如您所见,txtName设置为“left”textview,txtCityState设置为右侧textview。

在活动中,我将globalvariable设置为0或1,具体取决于用户点击Button01或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);
   }

但没有任何反应。这可能有什么问题?其他一切都很好。

将另一个adapterview与另一个row.xml文件一起使用会更容易。在另一个row.xml中,我会为textview设置不同的宽度,所以这将是一个简单的解决方案,但是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 :(得分:0)

您的ViewHolder似乎只是存储在带有convertView.setTag(holder)的convertView中,但不会影响convertView的布局。

影响convertView的唯一一行(至少在显示的代码中)是:

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

之后,convertView不会在任何地方更改。

<强>更新

View.setTag(object)仅用于存储一些参考数据,不会更改视图的布局。

答案 1 :(得分:0)

我会反过来的事情:

在持有人中,不要将字段命名为txtNametxtCityState,而是将其称为txtLefttxtRight

然后,移动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()