android检查项目是否已单击
我刚开始Android编程,事情是这样的 如何检查GridView中的项目是否已单击?类似于为网格中的每个项目指定一个布尔值“clicked”,并在每次单击该项目时更改其值 目前我只是使用一个布尔数组,所以如果我单击项[x],它会切换布尔[x],然后我检查它是否为真/假,并相应地修改该项,但必须有一种更整洁的方法来做同样的事情 我的代码:android检查项目是否已单击,android,gridview,click,boolean,Android,Gridview,Click,Boolean,我刚开始Android编程,事情是这样的 如何检查GridView中的项目是否已单击?类似于为网格中的每个项目指定一个布尔值“clicked”,并在每次单击该项目时更改其值 目前我只是使用一个布尔数组,所以如果我单击项[x],它会切换布尔[x],然后我检查它是否为真/假,并相应地修改该项,但必须有一种更整洁的方法来做同样的事情 我的代码: package com.example.mojrecnik; import java.io.BufferedReader; import java.io.F
package com.example.mojrecnik;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
public class Glavna extends Activity implements AdapterView.OnItemClickListener {
private static final int LENGTH_SHORT = 0;
GridView grid;
TextView tekst;
String[] izfajla = new String[200];
String[] izfajla2 = new String[200];
boolean[] kliknutmrs = new boolean[200];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_glavna);
grid=(GridView)findViewById(R.id.grid);
grid.setAdapter(new MojAdapter());
grid.setOnItemClickListener(this);
//tekst=(TextView)findViewById(R.id.tekst);
citaFajl();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_glavna, menu);
return true;
}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
TextView klik = (TextView)arg1.findViewById(R.id.gridtekst2);
if(kliknutmrs[arg2]) {
kliknutmrs[arg2]=!kliknutmrs[arg2];
klik.setText(izfajla[arg2]); }
else {
kliknutmrs[arg2]=!kliknutmrs[arg2];
klik.setText(izfajla2[arg2]); }
}
public void onNothingSelected(AdapterView<?> arg0) {
}
public void citaFajl() {
File kartica = Environment.getExternalStorageDirectory();
File fajl = new File(kartica, "reci.txt");
StringBuilder tekst = new StringBuilder();
int i=0;
try {
BufferedReader br = new BufferedReader(new FileReader(fajl));
String linija;
String[] prva;
while ((linija = br.readLine())!=null) {
prva = linija.split("-");
izfajla[i]=prva[0];
if(prva[1].length()>0)
izfajla2[i]=prva[1];
i++;
}
}
catch (IOException e) {
Toast greska = Toast.makeText(this, e.getMessage().toString(), LENGTH_SHORT);
greska.show();
}
}
private class MojAdapter extends ArrayAdapter {
public MojAdapter() {
super(Glavna.this, R.layout.gridvju, izfajla);
}
public View getView(int position, View convertView, ViewGroup parent) {
//vazno!! pravim vju od inflatera i vracam vju a ne convertvju!
View gridvju;
if(convertView==null) {
LayoutInflater inflater = getLayoutInflater();
gridvju = inflater.inflate(R.layout.gridvju, parent, false);
}
else
gridvju=convertView;
TextView tekst2 = (TextView)gridvju.findViewById(R.id.gridtekst2);
tekst2.setLines(2);
tekst2.setText(izfajla[position]);
return(gridvju);
}
}
}
package com.example.mojrecnik;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.IOException;
导入android.os.Bundle;
导入android.os.Environment;
导入android.app.Activity;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.GridView;
导入android.widget.AdapterView;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.support.v4.app.NavUtils;
公共类Glavna扩展活动实现AdapterView.OnItemClickListener{
私有静态最终整数长度_SHORT=0;
网格视图网格;
TextView tekst;
字符串[]izfajla=新字符串[200];
字符串[]izfajla2=新字符串[200];
布尔值[]kliknutmrs=新布尔值[200];
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_glavna);
grid=(GridView)findviewbyd(R.id.grid);
setAdapter(新的MojAdapter());
grid.setOnItemClickListener(this);
//tekst=(TextView)findViewById(R.id.tekst);
citaFajl();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.activity_glavna,menu);
返回true;
}
公共视图单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
TextView klik=(TextView)arg1.findViewById(R.id.gridtekst2);
if(kliknutmrs[arg2]){
kliknutmrs[arg2]=!kliknutmrs[arg2];
klik.setText(izfajla[arg2]);}
否则{
kliknutmrs[arg2]=!kliknutmrs[arg2];
klik.setText(izfajla2[arg2]);}
}
未选择公共无效(AdapterView arg0){
}
公共图书馆{
文件kartica=Environment.getExternalStorageDirectory();
文件fajl=新文件(kartica,“reci.txt”);
StringBuilder tekst=新的StringBuilder();
int i=0;
试一试{
BufferedReader br=新的BufferedReader(新文件读取器(fajl));
里尼娅;
字符串[]prva;
而((linija=br.readLine())!=null){
prva=linija.split(“-”);
izfajla[i]=prva[0];
if(prva[1].length()>0)
izfajla2[i]=prva[1];
i++;
}
}
捕获(IOE异常){
Toast greska=Toast.makeText(例如,getMessage().toString(),LENGTH\u SHORT);
greska.show();
}
}
私有类MojAdapter扩展了ArrayAdapter{
公共MojAdapter(){
super(Glavna.this、R.layout.gridvju、izfajla);
}
公共视图getView(int位置、视图转换视图、视图组父视图){
//加油!!加油!加油!加油!
查看gridvju;
if(convertView==null){
LayoutInflater充气机=getLayoutInflater();
gridvju=充气机。充气(R.layout.gridvju,父项,false);
}
其他的
gridvju=convertView;
TextView tekst2=(TextView)gridvju.findViewById(R.id.gridtekst2);
tekst2.设定线(2);
tekst2.setText(izfajla[职位]);
返回(gridvju);
}
}
}
和XML(主要内容):
和布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/gridtekst2" />
</LinearLayout>
没有保留“单击历史记录”之类的内容。若用户点击任何内容,若分配了onClickListener,您将收到关于该点击的通知。但您不能通过查询UI对象来检查这一点。布尔数组是可以的,但我会使用List或ArrayList,只需在onClickListener中添加点击项的id。无法确定按钮是否在单击之前被单击过。我想你一直在寻找像
if(button.wasOnceClicked){ //THERE IS NO CODE LIKE THIS
}
我说得对吗?嗯,巴顿班没有这个。
但是,您可以创建Button的子类并添加该属性,还可以添加一些处理该属性的代码。首先在onCreate中将布尔数组初始化为:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid);
grid=(GridView)findViewById(R.id.grid);
grid.setAdapter(new MojAdapter());
grid.setOnItemClickListener(this);
// HERE I have initialized with true valuse
for(int i=0; i<kliknutmrs.length; i++) {
kliknutmrs[i] = true;
}
//tekst=(TextView)findViewById(R.id.tekst);
citaFajl();
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_网格);
grid=(GridView)findviewbyd(R.id.grid);
setAdapter(新的MojAdapter());
grid.setOnItemClickListener(this);
//在这里,我用真值初始化
对于(int i=0;i这里是我最后的工作方式。我创建了一个自定义类来包含显示的文本,并在其中添加了bool,因此现在我的gridview中的每个元素都有自己的“单击检查程序”。
注意:这个程序只需在两个单词onClick之间切换,如果您想尝试,请使用文本文件,其中的数据格式为“word1-word2”
代码:
package com.example.mojrecnik;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入android.os.Bundle;
导入android.os.Environment;
导入android.app.Activity;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.GridView;
导入android.widget.AdapterView;
导入android.widget.TextView;
英普
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid);
grid=(GridView)findViewById(R.id.grid);
grid.setAdapter(new MojAdapter());
grid.setOnItemClickListener(this);
// HERE I have initialized with true valuse
for(int i=0; i<kliknutmrs.length; i++) {
kliknutmrs[i] = true;
}
//tekst=(TextView)findViewById(R.id.tekst);
citaFajl();
}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
TextView klik = (TextView)arg1.findViewById(R.id.gridtekst2);
if(kliknutmrs[arg2]) {
System.out.println(" ------------ 11111111111 -----------");
kliknutmrs[arg2]=!kliknutmrs[arg2];
klik.setText(izfajla2[arg2]); }
else {
System.out.println(" ------------- 222222222 -----------");
// NO NEED //kliknutmrs[arg2]=!kliknutmrs[arg2];
klik.setText(izfajla2[arg2]); }
}
package com.example.mojrecnik;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.Toast;
public class Glavna extends Activity implements AdapterView.OnItemClickListener {
private static final int LENGTH_LONG = 1;
GridView grid;
List<Rec> lReci = new ArrayList<Rec>(); //this is our list of data which contains text and bool check
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_glavna);
citaFajl();
grid=(GridView)findViewById(R.id.grid);
grid.setAdapter(new MojAdapter());
grid.setOnItemClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_glavna, menu);
return true;
}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
VjuHolder holder=(VjuHolder)arg1.getTag();
if(!lReci.get(arg2).clicked)
holder.text.setText(lReci.get(arg2).rec2);
else
holder.text.setText(lReci.get(arg2).rec1);
lReci.get(arg2).clicked = !lReci.get(arg2).clicked;
}
public void onNothingSelected(AdapterView<?> arg0) {
//////////////////////////////////////////
}
public void citaFajl() {
try {
BufferedReader br = new BufferedReader(new FileReader(new File(Environment.getExternalStorageDirectory(), "reci.txt")));
String[] reci = new String[2];
String linija;
Rec rec;
while ((linija = br.readLine()) != null) {
reci = linija.split("-"); //because data in my file is formatted 'word1 - word2', we separate them now so we can alternate between them
reci[1]=reci[1].trim();
rec = new Rec(reci[0], reci[1], false);
lReci.add(rec);
}
}
catch (IOException e) {
Toast.makeText(this, e.getMessage().toString(), LENGTH_LONG).show();
}
}
private class MojAdapter extends ArrayAdapter<String> {
public MojAdapter() {
super(Glavna.this, R.layout.gridvju);
}
public int getCount() {
return lReci.size(); //here we explicitly set the total number of grid elements so it doesn't go out of index range
}
public View getView(int position, View convertView, ViewGroup parent) {
VjuHolder holder;
if(convertView==null) {
LayoutInflater inflater = getLayoutInflater();
convertView = inflater.inflate(R.layout.gridvju, parent, false);
holder = new VjuHolder();
holder.text = (TextView)convertView.findViewById(R.id.gridtekst2);
convertView.setTag(holder); }
else
holder=(VjuHolder)convertView.getTag();
if(lReci.get(position).clicked) //check to make grid update according to the clicked state of our elements [when scrolling]
holder.text.setText(lReci.get(position).rec2);
else
holder.text.setText(lReci.get(position).rec1);
holder.text.setLines(2);
return(convertView);
}
}
}
//holder class
class VjuHolder {
TextView text;
}
//here we put the text to be displayed along with bool to check in which state is the clicked element
class Rec {
String rec1, rec2;
boolean clicked;
Rec(String rec, String druga, boolean klik) {
rec1 = rec;
rec2 = druga;
clicked = klik;
}
}