【问题标题】:How to preserve a position of a listview when returning to it返回时如何保留列表视图的位置
【发布时间】:2015-08-23 06:10:22
【问题描述】:

我遇到了与here 描述的问题类似的问题,该页面上的许多解决方案看起来都有效。问题是,我不知道我应该把他们写的代码放在哪里。我试过把它放在 onCreate 方法中,但它不起作用。我计划使用的解决方案是每次选择不同的项目时将静态数字设置为不同的 int,然后在创建页面时平滑滚动到该位置。不幸的是,如果我只是将它放入 onCreate 方法中,它似乎不起作用。我应该把它放在哪里? 如果你想看的话,我的代码在下面。

public class ElemSearch extends Periodic
{
private static int focusNum=22;
ListView mListView;
ArrayAdapter<String> adapter;

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.elem_search_layout);

    //This block is for the titlebar
    ImageButton back = (ImageButton) findViewById(R.id.back_button);
    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(ElemSearch.this, Periodic.class);
            startActivity(intent);
            overridePendingTransition(R.anim.fadein, R.anim.fadeout);
            v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
        }
    });
    //End titlebar block

    //Search Bar code
    final EditText inputSearch;
    inputSearch = (EditText) findViewById(R.id.editText);
    //Search Bar code continues later

    Resources res = getResources();
    final String[] elements = res.getStringArray(R.array.elements);

    String[] myKeys = getResources().getStringArray(R.array.elements);
    mListView = (ListView)findViewById(R.id.elemList);

    adapter= new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name,elements );
    mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myKeys));
    final List<String> elemList = Arrays.asList(getResources().getStringArray(R.array.elements));

    //Search Bar code continues
    inputSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            ElemSearch.this.adapter.getFilter().filter(cs);

            ArrayList<String> temp = new ArrayList<String>();
            int textlength = inputSearch.getText().length();
            temp.clear();
            for (int i = 0; i < elemList.size(); i++) {
                if (textlength <= elemList.get(i).length()) {
                    if (inputSearch.getText().toString().equalsIgnoreCase(
                            (String)
                                    elemList.get(i).subSequence(0,
                                            textlength))) {
                        temp.add(elemList.get(i));
                    }
                }
            }
            mListView.setAdapter(new ArrayAdapter<String>(ElemSearch.this, android.R.layout.simple_list_item_1, temp));
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
        }
    });

    //mListView is list view type
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
            //note that because arrays make zero sense and start at 0, the position is one int less than
            //the element's atomic number.
            initializeList(position);
            //Intent n = new Intent(getApplicationContext(), MainActivity.class);
            //n.putExtra("position", position);
            //startActivity(n);
            overridePendingTransition(R.anim.fadein, R.anim.fadeout);
            mListView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);

        }

    });

    ImageButton toTop = (ImageButton) findViewById(R.id.topButton);
    toTop.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            mListView.smoothScrollToPosition(0);
            mListView.setFastScrollEnabled(true);
            v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
        }
    });
}

public void initializeList(int position)
{
    Intent n;
    if(position==0)
    {
        n = new Intent(getApplicationContext(), Hydrogen.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=0;
    }
    if(position==1)
    {
        n = new Intent(getApplicationContext(), Helium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=1;
    }
    if(position==2)
    {
        n = new Intent(getApplicationContext(), Lithium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=2;
    }
    if(position==3)
    {
        n = new Intent(getApplicationContext(), Beryllium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=3;
    }
    if(position==4)
    {
        n = new Intent(getApplicationContext(), Boron.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=4;
    }
    if(position==5)
    {
        n = new Intent(getApplicationContext(), Carbon.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=5;
    }
    if(position==6)
    {
        n = new Intent(getApplicationContext(), Nitrogen.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=6;
    }
    if(position==7)
    {
        n = new Intent(getApplicationContext(), Oxygen.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=7;
    }
    if(position==8)
    {
        n = new Intent(getApplicationContext(), Flourine.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=8;
    }
    if(position==9)
    {
        n = new Intent(getApplicationContext(), Neon.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=9;
    }
    if(position==10)
    {
        n = new Intent(getApplicationContext(), Sodium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=10;
    }
    if(position==11)
    {
        n = new Intent(getApplicationContext(), Magnesium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=11;
    }
    if(position==12)
    {
        n = new Intent(getApplicationContext(), Aluminum.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=12;
    }
    if(position==13)
    {
        n = new Intent(getApplicationContext(), Silicon.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=13;
    }
    if(position==14)
    {
        n = new Intent(getApplicationContext(), Phosphorus.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=14;
    }
    if(position==15)
    {
        n = new Intent(getApplicationContext(), Sulfur.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=15;
    }
    if(position==16)
    {
        n = new Intent(getApplicationContext(), Chlorine.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=16;
    }
    if(position==17)
    {
        n = new Intent(getApplicationContext(), Argon.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=17;
    }
    if(position==18)
    {
        n = new Intent(getApplicationContext(), Potassium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=18;
    }
    if(position==19)
    {
        n = new Intent(getApplicationContext(), Calcium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==20)
    {
        n = new Intent(getApplicationContext(), Scandium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==21)
    {
        n = new Intent(getApplicationContext(), Titanium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==22)
    {
        n = new Intent(getApplicationContext(), Vanadium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==23)
    {
        n = new Intent(getApplicationContext(), Chromium.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==24)
    {
        n = new Intent(getApplicationContext(), Manganese.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==25)
    {
        n = new Intent(getApplicationContext(), Iron.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==26)
    {
        n = new Intent(getApplicationContext(), Cobalt.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==27)
    {
        n = new Intent(getApplicationContext(), Nickel.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==28)
    {
        n = new Intent(getApplicationContext(), Copper.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
    if(position==29)
    {
        n = new Intent(getApplicationContext(), Zinc.class);
        n.putExtra("position", position);
        startActivity(n);
        focusNum=position;
    }
}

@Override
protected void onResume()
{
    super.onResume();
    mListView.smoothScrollToPosition(focusNum);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

【问题讨论】:

  • 在 onResume() 上试试这个
  • 试过了。还是不行。 :/ 如果你想看,我附上了我的代码。
  • 尝试 setRetainInstance(true);如果 Periodic 是 Fragment 的子类
  • 我的周期性已经扩展了主活动,所以它不是片段的子。有什么办法吗?

标签: android listview smooth-scrolling


【解决方案1】:

好的,所以我在搞砸了一段时间后设法解决了这个问题。我的修复不是 100% 最优的,因为我从未找到问题的核心,但是,嘿,解决方案有效,所以我们开始吧。这个想法是在每次选择列表项时将静态数字设置为列表上的坐标。然后在 onCreate 方法中,使用 setSelection(focusNum) 而不是 smoothScrollTo(focusNum)。它非常适合我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多