【问题标题】:GridView Item color repeated OnScroll of view in Android?GridView项目颜色在Android中重复OnScroll的视图?
【发布时间】:2016-10-07 06:55:12
【问题描述】:

我在我的 Activity 中使用带有扩展 BaseAdapter 类的自定义适配器的 Gridview。

一切正常,我们在设置值时得到了想要的结果。但是当我们单击 gridview 的特定单元格并且我想更改该单元格中按钮的颜色时,问题就来了。OnClickListner 我们改变了按钮的颜色,如下所示:

 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {

            Toast.makeText(BookingActivity.this, "Hi click working" + position, Toast.LENGTH_SHORT).show();

            try {

                Button button = (Button) view.findViewById(R.id.button3);
                button.setBackgroundColor(Color.GREEN);

            } catch (Exception e) {
                e.printStackTrace();
            }

         }
    });

然后按钮的颜色已更改,但是当我们向上滚动网格视图时,颜色会在另一个单元格中重复。我不希望这种颜色进一步重复。 也许单元格被重用了,但是如何避免这种类型的重复。

这是我的适配器类

public class CustomGrid extends BaseAdapter {

private Context mContext;
private final ArrayList<String> web;



public CustomGrid(Context c,ArrayList<String> web) {
    mContext = c;
    this.web = web;

}

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

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return web.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View grid = convertView;

    CoachHolder holder = null;

    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (grid == null) {

        grid = inflater.inflate(R.layout.grid_single,parent,false);


        holder = new CoachHolder(grid);

        grid.setTag(holder);

    } else {
        holder =(CoachHolder)grid.getTag();
    }

    holder.button.setText(web.get(position));



    return grid;
}

static class CoachHolder {


    Button button;


    //TextView descriptions;


    public CoachHolder(View v) {


        button = (Button)v.findViewById(R.id.button3);

    }


}
 }

这是我的 grid_item.xml 文件:

  <?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="wrap_content"
  android:layout_height="wrap_content"
 android:background="@android:color/white">
 <Button
    android:layout_width="150dp"
    android:layout_height="100dp"
    android:text="New Button"
    android:id="@+id/button3"
    android:clickable="false"
    android:focusable="false"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />
 </RelativeLayout>

我想要多个单元格选择,当我单击单元格时,特定单元格颜色改变但不重复。 我想我无法使用位置获取特定的单元格按钮。

请帮助我摆脱这个问题,它已经花费了太多时间。 提前感谢您的帮助

【问题讨论】:

  • 您应该保存您单击的按钮的位置,然后在您滚动时再次加载它。看看stackoverflow.com/a/37041096/5381331。它是关于 CheckBox 的,但想法是一样的

标签: android gridview android-adapter android-gridview onitemclicklistener


【解决方案1】:

试试这个

  1. 在 getView 方法中设置单元格的颜色。
  2. 在适配器中添加一个方法来保存当前选择的位置
  3. 在您的onItemClickListener 中,调用saveSelectedItemPosition,然后调用notifyDatasetChanged

伪代码

public void saveSelectedItemPosition(int position){
    currentSelectedPosition = position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// do what you are currently doing
if(position == currentSelectedPosition){
    //change color 
} else {
    //use default color
}




return grid;

}

【讨论】:

  • 实际上我遇到了同样的问题.. 我的问题是,当我点击那个单元格或按钮时,颜色应该改变并且在滚动时不会重复
  • 我认为我的单元格是重复的,这就是为什么当用户单击单元格时单元格的颜色会重复..请帮助我提供一些可行的解决方案
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多