2012-07-20 36 views
3

我刚开始使用Android编程,就是这样。安卓系统检查是否点击了项目

如何检查GridView中的项是否已被点击?就像为Grid中的每个项目分配一个布尔型的“clicked”,并在每次单击该项目时更改其值。

目前我只是使用一个布尔数组,所以如果我点击item [x]它切换bool [x],然后检查它是否为真/假并相应地修改该项目,但必须做一个完美的方式!

我的代码:

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> 

回答

1

这里是我的工作,这到底。我创建了一个自定义类来包含显示的文本,并在其中添加了一个bool,所以现在gridview中的每个元素都有自己的“点击检查器”。 注:这个程序简单2个字之间交替的onClick,如果你想尝试一下使用文本文件,格式化数据“字1 - 单词2”

代码:

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; 
    } 
} 
0

有像 “点击历史” 保留没有这样的事。如果用户点击了任何内容,那么如果分配了onClickListener,您将收到关于该点击的通知。但是你不能通过查询UI对象来检查。布尔数组是可以的,但我会使用List或ArrayList,而只需在我的onClickListener中添加tapped项目的id。

+0

所以没有办法“添加”一布尔到每个视图? – 2012-07-20 15:53:37

+0

您可以使用标签,但仍然需要手动设置它们。 – 2012-07-22 22:41:57

0

有没有办法找出是否之前点击按钮。我认为你一直在寻找某种类的财产,如

if(button.wasOnceClicked){   //THERE IS NO CODE LIKE THIS 
    } 

对吗?那么,Button类没有这个。 但是你可以创建Button的子类并添加该属性并添加一些代码来处理该属性。

+0

不一定是第一次点击,但我想要的是让它在2个值之间交替。我有2个数组,当第一个数组值显示,我点击它,它改变到第二个数组值,反之亦然。 – 2012-07-20 15:50:28

0

首先初始化中的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(); 
} 

然后在的onClick,只是ckeck的布尔数组甲肝“真”值;所以请将该位置值“假”并同时用另一个String []数组反转文本值。

在第二次它会转到到别的部分:

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]); } 
} 
+0

是的,谢谢,但我希望它在2个州之间交替! – 2012-07-20 15:52:47