滚动时ListView项目会发生变化

时间:2015-04-20 06:05:08

标签: java android

我正在填写列表视图,这是代码:

ArrayAdapter<CharSequence> listAdapter1;
ListView toc;
toc=(ListView)findViewById(R.id.listView1);
listAdapter1=ArrayAdapter.createFromResource(Glossary.this,R.array.arabicalphabet,R.layout.glossarysimplerow);
toc.setAdapter(listAdapter1);

我在xml文件中设置了一个列表选择器,当点击列表中的任何项目时,它的颜色将变为蓝色以显示它已被选中。问题是,当我滚动列表视图时,选择将改变,例如,如果我有一个从A到Z填充的列表,如果我选择字母“B”并且我滚动了很多次,我会选择字母“M”。 .. 请帮忙

3 个答案:

答案 0 :(得分:1)

是的,我在一周前解决了这个问题,原因是&#34;当您滚动listview时,第一个显示项目的位置为0&#34;,因此您的更改视图将影响新项目。

我的解决方案是:

1)。在ScrollView内使用LinearLayout代替使用ListView

2)。将数组TextView[]添加到LinearLayout

代码:

布局:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="2dp"
    android:layout_marginRight="2dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp">
    <LinearLayout
        android:id="@+id/ll_inflater"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </LinearLayout>
</ScrollView>

爪哇:

int prePos = -1;
int sdk = android.os.Build.VERSION.SDK_INT;
LinearLayout ll_inflater = (LinearLayout)findViewById(R.id.ll_inflater);
TextView[] tv_Subs = new TextView[array.size()];//arrary is arrayData
for(int i = 0; i < array.size(); i++){
    tv_Subs[i] = new TextView(getApplication());
    tv_Subs[i].setLines(3);
    tv_Subs[i].setTextColor(getResources().getColor(R.color.sub_color));
    tv_Subs[i].setGravity(Gravity.CENTER);

    if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //set default background color
    } else {
        //set default background color
    }

    tv_Subs[i].setText(array.get(i));
    ll_inflater.addView(tv_Subs[i], i, new  ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
    final int finalI = i;
    tv_Subs[i].setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(prePos !=-1){
                 //change background of preposition tv_Subs[prePost] to default color
            }
            //change background color here
            prePos = finalI;
        }
    });
}

答案 1 :(得分:0)

在Android中AdapterView的{​​{1}}子项启用了缓存,因此当用户滚动时,屏幕上的项目不在内存中,ListView会调用项目滚动后显示在视图上。

getView()方法中传递的View会被重复使用,并具有getView()中之前可见的view的属性。这样可以提高ListView的性能,但需要检查所有可能的条件并重置ListView中收到的视图的所有属性。

现在你使用的通用getView()没有在点击时改变颜色的实现,它没有任何方法来保存已经点击的视图的记录。所以在滚动时结果是意料之外的。

您可以实施自己的ArrayAdapter课程,如下所示,它将解决您的问题:

Adapter

答案 2 :(得分:0)

我有一个决议。单击一个项目时,记录其position。然后覆盖onConfigurationChanged(Configuration newConfig),并致电ListView.setSelection(position)