我刚刚开始使用
Android编程,这就是问题所在.
如何检查GridView中的项目是否已被点击?比如为Grid中的EACH项目分配一个布尔’clicked’并在每次单击该项时更改它的值.
目前我只是使用一个bool数组,所以如果我点击项目[x]它会切换bool [x]然后我会检查它是否为true / false并相应地修改项目,但必须有一个更简洁的方式这样做!
我的代码:
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); } } }
和XML(主要):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- <TextView android:id="@+id/tekst" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:textSize="20dp" android:layout_below="@id/tekst" > </TextView> --> <GridView android:id="@+id/grid" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:horizontalSpacing="@dimen/padding_medium" android:numColumns="3" android:stretchMode="columnWidth" > </GridView> </RelativeLayout>
和布局:
<?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>
解决方法
以下是我最终的工作方式.我创建了一个自定义类来包含显示的文本,并在其中添加了一个bool,所以现在gridview中的每个元素都有自己的“点击检查器”.
注意:这个程序简单地在onClick之间交替显示2个单词,如果你想尝试使用带有数据格式化’word1 – word2’的文本文件
注意:这个程序简单地在onClick之间交替显示2个单词,如果你想尝试使用带有数据格式化’word1 – word2’的文本文件
码:
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,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,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,ViewGroup parent) { VjuHolder holder; if(convertView==null) { LayoutInflater inflater = getLayoutInflater(); convertView = inflater.inflate(R.layout.gridvju,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; } }