为什么我的BaseAdapter类不递增的getView的位置? [英] Why is my BaseAdapter class not incrementing the position in getView?

查看:268
本文介绍了为什么我的BaseAdapter类不递增的getView的位置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑:我的问题好像 BaseAdapter 只是不会发布超过1微调。如果我改变数组的大小为0,它不会放任何东西,但任何超过1被截断了。它从来没有从通过位置0 getView()它从不shwows了比1.我一直盯着它几个小时。有没有道理呢?

My issue seems like BaseAdapter just wont post more than 1 Spinner. If I change the array's size to 0, it wont put anything, but anything more than 1 is truncating it. It never passes position 0 from getView() and it never shwows anymore than 1. I have been at it for hours. Is there a reason for this?

我有添加问题纱厂动态在的ListView 使用 BaseAdapter 。我试了一下之前作为一个测试,以确保它能够正确的测试类来完成,并正确迭代的位置。但现在我再做它和它的失败。是不是 getView我的意思没有()创建新的微调,它从来没有离开还是位置0。运行。只是不添加更多的微调秒。
这是我的code:

I am having an issue with adding Spinners dynamically in a ListView using a BaseAdapter. I tried it before as a test to make sure it could be done correctly in a test class, and it iterates the positions correctly. But now I am doing it again and its failing. What I mean by failing is instead of getView() creating the new Spinner, it never leaves position 0. It still runs. Just never adds more Spinners. This is my code:

主要适配器code

public class RemindersAdapter extends BaseAdapter{
Spinner[] shownReminders = new Spinner[1];
TextView[] removeReminders = new TextView[1];
String[] reminders = new String[1]; //this hlds the values of the coresponding spinner

RemindersAdapter mAdapter;


@Override
public int getCount() {
    return shownReminders.length;
}

@Override
public Object getItem(int position) {
    return shownReminders[position];
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    Log.d("TAG", "A NEW SPINNER AND TEXTVIEW IS CREATED HERE WITH POSITION"+position);
    if(view == null) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        view = inflater.inflate(R.layout.reminder_spinner, parent, false);
    }

    Spinner reminderSpinner = (Spinner)view.findViewById(R.id.reminder_spinner);
    reminderSpinner.setTag(String.valueOf(position));
    ArrayAdapter<CharSequence> reminderAdapter = ArrayAdapter.createFromResource(
            parent.getContext(), R.array.reminders_array, android.R.layout.simple_spinner_item);
    reminderAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    reminderSpinner.setAdapter(reminderAdapter);
    reminderSpinner.setOnItemSelectedListener(new MyOnReminderSelectedListener());
    shownReminders[position] = reminderSpinner;

    TextView remove = (TextView)view.findViewById(R.id.remove_reminder);
    remove.setTag(String.valueOf(position));
    removeReminders[position] = remove;
    remove.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("The Array positioning of this remove view is: ", ""+v.getTag());

        }
    });


    return view;
}


public void addReminder() {
    Log.d("addReminder METHOD", "The Add Reminder method is running");

    Spinner[] temp = new Spinner[shownReminders.length+1];
    TextView[] temp2 = new TextView[removeReminders.length+1];
    String [] temp3 = new String[reminders.length+1];
    for(int i = 0; i < shownReminders.length; i++) {
        temp[i] = shownReminders[i];
        temp2[i] = removeReminders[i];
        temp3[i] = reminders[i];
    }
    shownReminders = temp;
    removeReminders = temp2;
    reminders = temp3;
    mAdapter.notifyDataSetChanged();//this just makes the adapter refresh itself

}

public void giveYourself(RemindersAdapter adapter) {
    mAdapter = adapter;
}


public class MyOnReminderSelectedListener implements OnItemSelectedListener{

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos,
            long id) {
        int position = Integer.parseInt(parent.getTag().toString()); //gets the position of the Spinner and puts it in the same index in the reminders array
        reminders[position] = parent.getItemAtPosition(pos).toString();
        for(int i =0; i < reminders.length; i++) Toast.makeText(parent.getContext(), i+": "+reminders[i], Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // Do nothing for now   
    }   
}//end of MyOnReminderSelectedListener innerclass   


}//end of Class


什么在活动运行

reminderList = (ListView)findViewById(R.id.reminders_list);
    reminderAdapter = new RemindersAdapter();
    reminderAdapter.giveYourself(reminderAdapter);
    reminderList.setAdapter(reminderAdapter);

    TextView addReminder = (TextView)findViewById(R.id.add_reminder);
    addReminder.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("TAG", "The onClick is running !");
            reminderAdapter.addReminder();
        }
    });


我很茫然,因为我的code长相酷似我的测试code,有一些修改,以便它与我的应用程序工作。但是到了适配器使用的信息是pretty大同小异。我要发布测试code,以及让你们可以看到code的作品。


I am at a loss because my code looks exactly like my test code, with some modifications in order for it to work with my app. But the information used by the Adapter is pretty much the same. I am going to post the test code as well so you guys can see the code that works.

测试code

public class RemindersAdapter extends BaseAdapter{
Spinner[] shownReminders = new Spinner[1];
ArrayList<TextView> removeSpinner = new ArrayList<TextView>();
Context mContext;

public RemindersAdapter(Context context) {
    mContext = context;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return shownReminders.length;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return shownReminders[position];
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    Log.d("TAG", "Number of times this is running"+position);
    Log.d("TAG", "Address of the Spinner Object"+shownReminders[position]);
    if(view == null) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        view = inflater.inflate(R.layout.reminder_spinner, parent, false);
    }

    Spinner reminderSpinner = (Spinner)view.findViewById(R.id.reminders_spinner);
    reminderSpinner.setTag("1"); 
    ArrayAdapter<CharSequence> reminderAdapter = ArrayAdapter.createFromResource(
            parent.getContext(), R.array.reminders_array, android.R.layout.simple_spinner_item);
    reminderAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    reminderSpinner.setAdapter(reminderAdapter);
    reminderSpinner.setOnItemSelectedListener(new MyOnReminderSelectedListener());
    shownReminders[position] = reminderSpinner;

    TextView remove = (TextView)view.findViewById(R.id.remove_reminder);
    remove.setTag(position);
    removeSpinner.add(remove);
    remove.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int pos = Integer.parseInt(v.getTag().toString());
            removeSpinner.remove(pos);
            Spinner[] temp = new Spinner[shownReminders.length-1];
            for(int i =0; i < shownReminders.length; i++) {
                if(i == pos || i > pos) {
                    temp[i-1] = shownReminders[i];
                } else {
                    temp[i] = shownReminders[i];
                }
            }
            //Here i should refresh somewhow

        }
    });

    return view;
}

public void addReminder() {
    Spinner[] temp = new Spinner[shownReminders.length+1];
    for(int i = 0; i < shownReminders.length; i++) {
        temp[i] = shownReminders[i];
    }
    shownReminders = temp;
}


/*
 * Listener for when the reminder spinner gets a value the user entered
 * */
public class MyOnReminderSelectedListener implements OnItemSelectedListener{

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos,
            long id) {
        //does nothing for now

    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // Do nothing for now   
    }   
}//end of MyOnReminderSelectedListener innerclass


我也有一个问题,为什么适配器运行本身这么多。举例来说,使用日志,我注意到它调用 getView()两次没有明显的原因。它的怪异,它有这种行为。我想我不明白 BaseAdapter 这么好。先谢谢了。


I also have a question as to why the Adapter runs itself so much. For examples, using the Log, I noticed it calls getView() twice for no apparent reason. Its weird that it has this behavior. I guess I don't understand BaseAdapter so well. Thanks in advance.

推荐答案

这是适配器将调用getView的ListView时需要新的项目展示。所以,如果你的ListView不滚动,没有新的项目被创建,并getView没有呼叫。结果
 但你不应该存储所有微调对象,并在getView不应该创建新的对象了。这就是导致慢,也许浪费内存。

An adapter will call getView when listView need new item to show. So, if your listView not scroll, no new item be created, and no call to getView.
But you should not store all spinner object, and should not create new object in getView too. Thats cause slow and maybe waste memory.

这篇关于为什么我的BaseAdapter类不递增的getView的位置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆