onitemclicklistener无法在自定义列表视图中工作。?

时间:2013-03-08 05:59:54

标签: android

main.xml中

<include layout="@layout/header" />

<ListView
    android:id="@+id/alist"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:dividerHeight="0dp"
    android:listSelector="@drawable/list_selector" />

<TextView
    android:id="@+id/android:empty"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/no_reminders"
    android:visibility="gone" />
<TextView
android:id="@+id/TextView02" 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>

ReminderListActivity.java

package com.dummies.android.taskreminder;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import com.dummies.android.taskreminder.R;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CursorAdapter;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;

public class ReminderListActivity extends Activity implements OnClickListener {
    private static final int ACTIVITY_CREATE = 0;
    private static final int ACTIVITY_EDIT = 1;

    private RemindersDbAdapter mDbHelper;
    ListView lvRemind;
    ListView llv;
    ImageButton btnAdd, btnBack, btnSettings;
    TextView text;
    LinearLayout layout;
    ArrayAdapterExample aAdapter;
    String remainTime;
    int finalVal;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        // setContentView(R.layout.reminder_list);
        LayoutInflater inflate = LayoutInflater.from(this);
        layout = (LinearLayout) inflate.inflate(R.layout.main, null);
        this.setContentView(layout);
        btnAdd = (ImageButton) findViewById(R.id.btnAdd);
        btnBack = (ImageButton) findViewById(R.id.btnBackMain);
        btnSettings = (ImageButton) findViewById(R.id.btnSettings);

        btnAdd.setOnClickListener(this);
        btnBack.setOnClickListener(this);
        btnSettings.setOnClickListener(this);
        mDbHelper = new RemindersDbAdapter(this);
        mDbHelper.open();

        llv = (ListView) findViewById(R.id.alist);
        fillData();

        llv.setAdapter(aAdapter);
        llv.setClickable(true);
        llv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                Toast.makeText(ReminderListActivity.this, "hello", Toast.LENGTH_SHORT).show();

            }
        });
        registerForContextMenu(llv);

    }

    private void fillData() {
        Cursor remindersCursor = mDbHelper.fetchAllReminders();
        startManagingCursor(remindersCursor);

        // Create an array to specify the fields we want to display in the list
        // (only TITLE)
        String[] from = new String[] { RemindersDbAdapter.KEY_TITLE };

        Log.d("Length: ", "" + from.length);
        // and an array of the fields we want to bind those fields to (in this
        // case just text1)
        int[] to = new int[] { R.id.text1 };

        // Now create a simple cursor adapter and set it to display
        // SimpleCursorAdapter reminders =
        // new SimpleCursorAdapter(this, R.layout.reminder_row, remindersCursor,
        // from, to);
        // setListAdapter(reminders);

        text = (TextView) findViewById(R.id.TextView02);



        // listview.setLayoutParams(new LinearLayout.LayoutParams(
        // LinearLayout.LayoutParams.FILL_PARENT,
        // LinearLayout.LayoutParams.FILL_PARENT));
        // layout.addView(listview);

        aAdapter = new ArrayAdapterExample(ReminderListActivity.this,
                mDbHelper.fetchAllReminders());




    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater mi = getMenuInflater();
        mi.inflate(R.menu.list_menu_item_longpress, menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_delete:
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            mDbHelper.deleteReminder(info.id);
            fillData();
            return true;
        }
        return super.onContextItemSelected(item);
    }

    private void createReminder() {
        Intent i = new Intent(this, ReminderEditActivity.class);
        startActivityForResult(i, ACTIVITY_CREATE);
    }

    // @Override
    // protected void onListItemClick(ListView l, View v, int position, long id)
    // {
    // super.onListItemClick(l, v, position, id);
    // Intent i = new Intent(this, ReminderEditActivity.class);
    // i.putExtra(RemindersDbAdapter.KEY_ROWID, id);
    // startActivityForResult(i, ACTIVITY_EDIT);
    // }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        fillData();
    }

    @SuppressLint("NewApi")
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnAdd:
            createReminder();
            break;
        case R.id.btnSettings:
            Intent i = new Intent(this, TaskPreferences.class);
            startActivity(i);
            break;
        case R.id.btnBackMain:
            onBackPressed();
            break;
        default:
            break;
        }

    }

    @SuppressLint("NewApi")
    @Override
    public void onBackPressed() {

        super.onBackPressed();
    }

    class ArrayAdapterExample extends CursorAdapter {

        public ArrayAdapterExample(Context context, Cursor c) {

            super(context, c);

        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            // TODO Auto-generated method stub
            SeekBar sBar = (SeekBar) view.findViewById(R.id.seekBarTime);

            String curDte = cursor.getString(cursor
                    .getColumnIndex(cursor.getColumnName(3)));



            TextView txtNote = (TextView) view.findViewById(R.id.label);
            TextView tvDateValue = (TextView) view.findViewById(R.id.tvValueDate);
            txtNote.setText(cursor.getString(cursor.getColumnIndex(cursor
                    .getColumnName(1))));
            DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm a");
            Date date = new Date();

            try {
                String format = "dd-MM-yyyy hh:mm a";

                DateFormat sdf = new SimpleDateFormat(
                        "EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);

                String v_date_str = cursor.getString(cursor
                        .getColumnIndex(cursor.getColumnName(4)));

                String curDate = cursor.getString(cursor
                        .getColumnIndex(cursor.getColumnName(3)));
                Log.d("CUrr SET DAT: ", curDate);

                // String setDate =sdf.format(dt + " " + tm);
                Date v_date = new SimpleDateFormat("yyyy-MM-dd HH:mm",
                        Locale.ENGLISH).parse(v_date_str);
                DateFormat formatter = null;

                formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm a");

                Log.d("sset: ", "" + formatter.format(v_date));
                String currDate = dateFormat.format(date);

                String setDate = formatter.format(v_date);
                tvDateValue.setText(setDate);
                Date cDate = new SimpleDateFormat("dd-MM-yyyy hh:mm a")
                        .parse(currDate);
                Log.d("Current: ", "" + cDate);

                Date sDate = new SimpleDateFormat("dd-MM-yyyy hh:mm a")
                        .parse(setDate);

                Date startDate = new SimpleDateFormat("dd-MM-yyyy hh:mm a").parse(curDate);
                Log.d("Set: ", "" + sDate);

                long diff = sDate.getTime() - cDate.getTime();
                if(diff>0){
                    long dif = sDate.getTime() - startDate.getTime();
                    Log.d("Starting: ", ""+dif);
                    Log.d("Ending: ", ""+diff);

                    int dif1 = (int)dif;
                    int dif2 = (int)diff;

                    Log.d("Starting1: ", ""+dif1);
                    Log.d("Ending2: ", ""+dif2);

                    sBar.setMax(100);


                    finalVal = 100*dif2/dif1;

                    Log.d("Result: ", ""+finalVal*100);
                    TextView txtPer = (TextView)view.findViewById(R.id.tvPercent);
                    txtPer.setText(""+finalVal+"% left");
                    sBar.setProgress(finalVal);

                    double diffInHours = diff / ((double) 1000 * 60 * 60);
                    double minLeft = (diffInHours - (int) diffInHours) * 60;
                    long mLeft = Math.round(minLeft);

                    remainTime = "("+(int) diffInHours + "H " + mLeft
                            + "M)";
                    TextView txtTime = (TextView) view
                            .findViewById(R.id.tvBelowSeekBar);

                    txtTime.setText(remainTime);
                    txtTime.setTextColor(Color.MAGENTA);

                }
                else{
                    long diffRev = cDate.getTime() - sDate.getTime();
                    double diffInHours = diff / ((double) 1000 * 60 * 60);
                    double minLeft = (diffInHours - (int) diffInHours) * 60;
                    long mLeft = Math.round(minLeft);

                    remainTime = "(Overdue!)";

                    TextView txtTime = (TextView) view
                            .findViewById(R.id.tvBelowSeekBar);

                    txtTime.setText(remainTime);
                    txtTime.setTextColor(Color.RED);
                }


            } catch (ParseException e) {
                e.printStackTrace();
            }





        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            // TODO Auto-generated method stub
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());

            View retView = inflater
                    .inflate(R.layout.list_remind, parent, false);

            return retView;
        }

    }

}

注意:我在自定义onitemclicklistener上实施了listview。但它不起作用。

1 个答案:

答案 0 :(得分:1)

按照以下方式创建ListView控件,

llv = (ListView) layout.findViewById(R.id.alist); 

执行此操作的原因是,在您的代码中创建动态布局时,Listview在普通布局中不可用。