I have a strange error in my code and i can’t see the problem. I have a main class where I have an other class inside. I have an arraylist declared in the main class and if I acces to it in somepart of the class i can have all the information but when i acces to it in the inner class it can’t see the data. Why?
The inner class is an BaseAdapter for making a viewlist. I called it from oncreate bundle as:
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);
and the inner class is (the problem is at the end of it):
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];
}
}
What is strange is that this baseAdapter is for a listview and when it updates it’s data there’s as rows as arraylist.length but its data it’s not include it and all rows are detected as the same when clicking it.
Problem solved.
I changed the code to this one: techdroid.kbeanie.com/2009/07/custom-listview-for-android.html