0

我使用偶数行和奇数行将背景设置为我的列表视图行。在我的 EffectiveAdapter 中,我将行背景设置如下:

public View getView(int position, View convertView, ViewGroup parent) {
        vi = convertView;

        if (convertView == null) {

            vi = inflater.inflate(R.layout.ecran_multiple_row, null);
            holder = new ViewHolder();

            holder.txIndex = (TextView) vi.findViewById(R.id.txIndex);
            holder.txSTitle = (TextView) vi.findViewById(R.id.txSTitle);
            holder.btOnOFF = (ImageView) vi.findViewById(R.id.btOnOFF);
            vi.setTag(holder);


        } else
            holder = (ViewHolder) vi.getTag();



        /*
         * CHANGE ROW COLOR 0 WHITE 1 GRAY
         */

        if ( position % 2 == 0) //0 even 1 odd..
              vi.setBackgroundResource(R.drawable.listview_selector_odd);

            else
                vi.setBackgroundResource(R.drawable.listview_selector_even);


        /*
         * ONE ITEM IN ARRAY
         */

        if (data.toArray().length==1){
            holder.btOnOFF.setBackgroundResource(R.drawable.air_radio_button_rouge);
        }else {

            holder.btOnOFF.setBackgroundResource(R.drawable.air_deezer_check);
        }

        return vi;
    }

在我的 MainActivity.Class 中。我使用 itemclicklistener() 选择一个项目,如下所示:

**lvRMultiple.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {



                 imgview = (ImageView) view.findViewById(R.id.btOnOFF);
                 //And change its background here
                 imgview.setBackgroundResource(R.drawable.air_radio_button_rouge);


            }
        });**

当我点击一个项目 btnOff 图像更改成功但当我向下滚动时它更改为默认背景。其次,当我在另一个项目之后单击一个项目时,两者都成为新图像,但我只希望用户单击的行更改为新图像,并且前一个图像设置为默认值。

4

2 回答 2

3

由BaseAdpter 类的 getView() 方法创建的 ListView 的所有行视图 。当我们滚动 ListView 时,getView() 使用回收创建新的可行行。因此,当新行在滚动时可行时,一次又一次地调用 getView() 。

您的问题有两种解决方案:-\

  • 可以保存 ListView 的状态

// 保存 ListView 状态 Parcelable state = listView.onSaveInstanceState();

// Set new items
listView.setAdapter(adapter);

// Restore previous state (including selected item index and scroll position)
listView.onRestoreInstanceState(state)
  • 其他解决方案是在运行时创建 RowView 并使用 addView() 方法将其添加到父布局中。

LayoutInflater inflater = LayoutInflater.from(context);

// You should use the LinerLayout instead  of the listview, and parent Layout should be inside of the ScrollView
parentView = (LinerLayout)this.findViewById(R.id.parentView);

for(int i = 0; i<=numberOfRow;i++){
   LinearLayout rowView = (LinerLayout)inflater.inflate(R.layout.rowView);
   ImageView rowImageView = (ImageView)rowView.findViewById(R.id.rowImage);
   rowImageView.setOnClickListener(new View.onClickListListener(){
     @Override
      public void onClick(){
        rowImageView.setImageBitmap(onClickBitmapImage);      
 }

});
parentView.addView(rowView); 
}

请在返回 ListView 时检查此答案维护/保存/恢复滚动位置

更多参考 http://developer.android.com/reference/android/widget/Adapter.html#getView(int,android.view.View , android.view.ViewGroup)

于 2013-07-01T17:15:56.897 回答
0

该项目更改回默认背景,因为视图被回收。这与复选框失去选中状态的问题相同

看看这个答案也看看如何处理它:

CheckBox 在自定义列表视图中滚动时未选中

至于你的第二个问题,我相信它已经在这里得到了回答:

在android的listview中突出显示所选项目

希望能帮助到你

于 2013-07-01T13:18:41.187 回答