【问题标题】:Android GridView selector not working. Also how to get gridlines for specific columns in GridView?Android GridView 选择器不起作用。另外如何获取 GridView 中特定列的网格线?
【发布时间】:2017-04-12 05:18:07
【问题描述】:

我正在 Android 上构建数独应用程序。我想用 81 个文本视图填充屏幕。我为此使用了 GridView。有些我的选择器无法正常工作。我为文本视图的背景定义了两个 xml。一个用于选中和未选中。我有一个在 Gridview xml 中调用的选择器 xml。但是当我点击它们时,我的文本视图是不可选的。

这是我的 xml: selected.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle" >
<solid android:color="#ffffff" />
<stroke android:width="4dp" android:color="#4f7df2"/>
</shape>

unselected.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle" >
    <solid android:color="#ffffff" />
    <stroke android:width="0.5dp" android:color="#9C7F7F"/>
</shape>

选择器.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/selected"
    android:state_selected="true"/>
<item android:drawable="@drawable/unselected"/>
</selector>

我还想进一步将其划分为 9 个网格。我想用网格线来划分它,这样用户就可以清楚地看到他在哪个网格中。我该如何实现这个目标?

这是我的 SudokuAdapter 类

public class SudokuAdapter extends BaseAdapter {
private Context context;

public SudokuAdapter(Context context) {
    this.context = context;
}

@Override
public int getCount() {
    return 81;
}

@Override
public Object getItem(int position) {
    return null;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView textView;
    if (convertView == null) {
        // if it's not recycled, initialize some attributes
        textView = new TextView(context);
        textView.setBackground(context.getDrawable(R.drawable.unselected));
        textView.didTouchFocusSelect();
        textView.requestFocus();
        textView.setLayoutParams(new GridView.LayoutParams(60, 60));
    } else {
        textView = (TextView) convertView;
    }

    return textView;
}
}

我尝试从上面删除 setBackground,然后选择器仅用于选择文本视图。如果未选中,我希望默认背景被取消选中。

这是我的活动:

public class TestActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sudoku_grid_layout);

    GridView gridView = (GridView) findViewById(R.id.sudoku_grid);
    gridView.setAdapter(new SudokuAdapter(this));

} 
}

这是我的 xml:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sudoku_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="9"
android:listSelector="@drawable/selector"
android:gravity="center"
/>

【问题讨论】:

    标签: java android android-layout gridview


    【解决方案1】:

    您甚至不必使用适配器来使其可选择。您的数据集不会改变。只需使用表格布局并循环遍历单元格。

    要使文本视图可选择,请使用它。

    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            textView.setSelected(true);
        }
    }
    

    【讨论】:

    • 但是当我切换到别的东西时我想取消选择它。
    • 为使之成为可能,请在选择新的 textview 时循环遍历所有 textview 和 textView.setSelected(false)。
    【解决方案2】:

    你可以这样做

    textView.setOnClickClickListener(new View.OnClickListener() {
    private boolean stateChanged;
    public void onClick(View view) {
        if(stateChanged) {
            // reset background to default;
            textView.setBackgroundDrawable(circleOffDrawable);
        } else {
            textView.setBackgroundDrawable(circleOnDrawable);
        }
        stateChanged = !stateChanged;
     }
    });
    

    您必须保持选中状态或未选中状态 并且也在你的适配器中改变 setBackground 的行

    textView.setBackground(context.getDrawable(R.drawable.selector));
    

    由于选择器具有这两个属性,因此它会自动为您更改。

    【讨论】:

    • setTextIsSelectable(true) 使文本可选择而不是文本视图。它用于复制粘贴目的。
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多