0

我的代码中有一个奇怪的错误,我看不到问题所在。我有一个主课,里面还有另一个课。我在主类中声明了一个数组列表,如果我在类的某个部分访问它,我可以获得所有信息,但是当我在内部类中访问它时,它看不到数据。为什么?

内部类是用于制作视图列表的 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 一样,但它的数据不包括它,并且在单击它时所有行都被检测为相同。

4

2 回答 2

0

尝试这个:

@Override
public int getCount() {
    if(Main.data2!=null)
    {
        return Main.data2.size();
    }
    else
    {
        return 0;
    }
}

@Override
public String getItem(int position) {
    if(Main.data2!=null)
    {
        return Main.data2.get(position);
    }
    else
    {
        return null;
    }
}
于 2012-02-12T17:09:43.637 回答
0

问题解决了。我将代码更改为这个:techdroid.kbeanie.com/2009/07/custom-listview-for-android.html

于 2012-02-15T23:31:39.527 回答