我的代码中有一个奇怪的错误,我看不到问题所在。我有一个主课,里面还有另一个课。我在主类中声明了一个数组列表,如果我在类的某个部分访问它,我可以获得所有信息,但是当我在内部类中访问它时,它看不到数据。为什么?
内部类是用于制作视图列表的 BaseAdapter。我从 oncreate 包中将其称为:
public class Main extends ListActivity implements OnClickListener {
//new adapter
private EfficientAdapter adap;
//The variable which makes the error
public static ArrayList<String> data2 = new ArrayList<String>();
protected static Context mContext=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nuevoingr);
data2.clear();
data2.add("just adding 1");
adap = new EfficientAdapter(this);
setListAdapter(adap);
内部类是(问题在它的末尾):
public static class EfficientAdapter extends BaseAdapter implements Filterable {
private LayoutInflater mInflater;
private Context context;
public EfficientAdapter(Context context) {
// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
this.context = context;
}
/**
* Make a view to hold each row.
*
* @see android.widget.ListAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
public View getView(final int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid
// unneccessary calls
// to findViewById() on each row.
ViewHolder holder;
// When convertView is not null, we can reuse it directly, there is
// no need
// to reinflate it. We only inflate a new View when the convertView
// supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.pruebas, null);
// Creates a ViewHolder and store references to the two children
// views
// we want to bind data to.
holder = new ViewHolder();
holder.textLine = (TextView) convertView.findViewById(R.id.pr2);
holder.buttonLine = (ImageButton) convertView.findViewById(R.id.pr1);
convertView.setOnClickListener(new OnClickListener() {
private int pos = position;
@Override
public void onClick(View v) {
Toast.makeText(context, "Click-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();
}
});
holder.buttonLine.setOnClickListener(new OnClickListener() {
private int pos = position;
@Override
public void onClick(View v) {
Toast.makeText(context, "Delete-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
// Bind the data efficiently with the holder.
holder.textLine.setText(String.valueOf(position));
return convertView;
}
static class ViewHolder {
TextView textLine;
ImageButton buttonLine;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
//Here it comes the problem. Before editing my program this code was provide to include only a few values from
a String array declared at the same moment of data2 called data. What I do now is to declare an arraylist so
I can include more values and then I refresh the adaptor and here I pass the arraylist to an array to be equal as
it was before.
@Override
public int getCount() {
// TODO Auto-generated method stub
String [] change = (String[]) data2.toArray(new String[data2.size()]);
return change.length;
//return data.length;
}
//Same problem
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
String [] change = (String[]) data2.toArray(new String[data2.size()]);
return change[position];
//return data[position];
}
}
奇怪的是,这个 baseAdapter 是用于列表视图的,当它更新它的数据时,它的数据与 arraylist.length 一样,但它的数据不包括它,并且在单击它时所有行都被检测为相同。