Android的检查,如果项目点击(android check if item clicked)

2019-09-19 21:56发布

我刚开始使用Android编程和这里的东西。

如何检查是否在GridView中项目已经点击了? 喜欢的东西分配在网格中每个项目的布尔“点击”,并改变其值的每一次点击的项目。

目前,我只是用布尔变量数组所以如果我点击项目[X]它切换布尔[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>

Answer 1:

这里是我的工作,这到底。 我创建了一个自定义类包含具有显示和还增加了在那里一个布尔值,所以现在我的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;
    }
}


Answer 2:

还有像“点击历史”保留没有这样的事。 如果用户点击任何东西的话,如果有onClickListener分配,你会得到通知有关自来水。 但是你不能检查通过查询UI对象。 布尔数组是好的,但我会使用列表或ArrayList的替代,只是在我的onClickListener添加窃听项目的ID。



Answer 3:

有没有办法找出按钮之前还是不点击。 我觉得你一直在寻找某种类属性的像

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

我对吗? 好了,Button类不具备这一点。 然而ü可以创建按钮的子类,并添加属性,也可以添加一些代码,将处理该属性。



Answer 4:

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


文章来源: android check if item clicked