在GridView中启动计时器

时间:2014-07-03 00:09:12

标签: java android gridview

我的GridView有问题。

我想有一个带有图片的网格,每个下面应该是一个计时器。当我单击其中一个图像时,应该启动它的定时器。

如何使TextView和图像适应Gridview并让TextView每秒都改变。

我现在将代码更改为此

MainActivity

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends Activity implements Runnable{
    /** The Constant INTERVALL. */
    private static final int INTERVALL = 1000;

    private ImageAdapter mAdapter;
    private ArrayList<String> listText;
    private ArrayList<Integer> listImage;
    private GridView gridView;

    /** The handler. */
    private Handler handler = new Handler();

    public boolean timerRuns = false;
    public int time ;
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grid);

        //GridView gridview = (GridView) findViewById(R.id.gridview);
        //gridview.setAdapter(new ImageAdapter(this));

        prepareList();

        // prepared arraylist and passed it to the Adapter class
        mAdapter = new ImageAdapter(this, listText, listImage);

        // Set custom adapter to gridview
        gridView = (GridView) findViewById(R.id.gridView);
        gridView.setAdapter(mAdapter);

        // Implement On Item click listener
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                                    long arg3) {
                Toast.makeText(MainActivity.this, mAdapter.getItem(position), Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public final void run() {
        chronometer();
    }

    public void startTimer(View v) {
        timerRuns = true;
        time = 5*60;
        update();
        this.handler.postDelayed(this, INTERVALL);
    }

    public void stopTimer(View v) {
        timerRuns = false;
        handler.removeCallbacks(this);
    }


    public void chronometer(){
        time = time -1;
        update();
        handler.postDelayed(this, INTERVALL);
    }

    private void update(){
        updateScreen();
    }

    private void updateScreen(){
        //TextView tvChronometer = (TextView)findViewById(R.id.tvChronometer);
        //tvChronometer.setText(Integer.toString(time));
    }







        public void prepareList()
        {
            listText = new ArrayList<String>();

            listText.add("Sample");
            listText.add("Brazil");
            listText.add("Canada");
            listText.add("China");
            listText.add("France");
            listText.add("Germany");
            listText.add("Iran");
            listText.add("Italy");
            listText.add("Japan");
            listText.add("Korea");
            listText.add("Mexico");
            listText.add("Netherlands");
            listText.add("Portugal");
            listText.add("Russia");
            listText.add("Saudi Arabia");
            listText.add("Spain");
            listText.add("Turkey");
            listText.add("United Kingdom");
            listText.add("United States");

            listImage = new ArrayList<Integer>();
            listImage.add(R.drawable.sample_0);
            listImage.add(R.drawable.sample_3);
            listImage.add(R.drawable.sample_3);
            listImage.add(R.drawable.sample_7);
            listImage.add(R.drawable.sample_1);
            listImage.add(R.drawable.sample_6);
            listImage.add(R.drawable.sample_2);
            listImage.add(R.drawable.sample_7);
            listImage.add(R.drawable.sample_4);
            listImage.add(R.drawable.sample_5);
            listImage.add(R.drawable.sample_0);
            listImage.add(R.drawable.sample_5);
            listImage.add(R.drawable.sample_0);
            listImage.add(R.drawable.sample_2);
            listImage.add(R.drawable.sample_1);
            listImage.add(R.drawable.sample_4);
            listImage.add(R.drawable.sample_3);
            listImage.add(R.drawable.sample_1);
            listImage.add(R.drawable.sample_6);
        }

    }

ImageAdapter

`public class ImageAdapter extends BaseAdapter {
private ArrayList<String> listText;
private ArrayList<Integer> listImage;
private Activity activity;

public ImageAdapter(Activity activity,ArrayList<String> listText, ArrayList<Integer> listImage) {
    super();
    this.listText = listText;
    this.listImage = listImage;
    this.activity = activity;
}



@Override
public int getCount() {

    return listText.size();
}

@Override
public String getItem(int position) {

    return listText.get(position);
}

@Override
public long getItemId(int position) {

    return 0;
}

public static class ViewHolder
{
    public ImageView imgView;
    public TextView txtView;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder view;
    LayoutInflater inflator = activity.getLayoutInflater();

    if(convertView==null)
    {
        view = new ViewHolder();
        convertView = inflator.inflate(R.layout.element, null);

        view.txtView = (TextView) convertView.findViewById(R.id.eText);
        view.imgView = (ImageView) convertView.findViewById(R.id.eImage);

        convertView.setTag(view);
    }
    else
    {
        view = (ViewHolder) convertView.getTag();
    }

    view.txtView.setText(listText.get(position));
    view.imgView.setImageResource(listImage.get(position));

    return convertView;
}

}` 我的gridview

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="110dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>

和我的element.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp" >

<ImageView
    android:id="@+id/eImage"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:src="@color/Bisque" >
</ImageView>

<TextView
    android:id="@+id/eText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:textSize="15sp" >
</TextView>

I hope you can help me.

1 个答案:

答案 0 :(得分:0)

<强> 1。在每个单元格中创建包含文本和图像的网格视图

看一下GridView的文档: http://developer.android.com/guide/topics/ui/layout/gridview.html

关键方法是public View getView(int position, View convertView, ViewGroup parent)

该方法返回网格中每个单元格的视图。您可以创建包含TextView和ImageView的XML布局。在适配器的getView方法中扩展XML布局,附加一个onClickListener,以便您可以启动计时器并将其作为视图返回。

<强> 2。从网格更新TextView

请记住,gridview包含多个视图,每个视图都可以来自同一个资源,因此:TextView tvChronometer = (TextView)findViewById(R.id.tvChronometer);无法在gridview中工作。

您需要做的是从您需要的单元格中获取特定视图(或迭代所有这些视图)并更新视图。像这样:

//First get the view for the cell assuming it's a composite view
View cellView = (TextView) gridview.getChildAt(position);

//Then get the actual TextView from that grid cell
TextView tvChronometer = cellView.findViewById(R.id.tvChronometer);

虽然我认为最好的方法是在适配器中创建/实例化时保存对TextView的引用。