我有一个列表视图,其中包含两个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这里。在按钮监听器之外它可以正常工作。
答案 0 :(得分:0)
您的ViewHolder似乎只是存储在带有convertView.setTag(holder)
的convertView中,但不会影响convertView的布局。
影响convertView的唯一一行(至少在显示的代码中)是:
convertView = mInflater.inflate(R.layout.row, null);
之后,convertView不会在任何地方更改。
<强>更新强>
View.setTag(object)
仅用于存储一些参考数据,不会更改视图的布局。
答案 1 :(得分:0)
我会反过来的事情:
在持有人中,不要将字段命名为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()