定义按ListView中的TextView和按钮的操作

时间:2015-01-01 20:47:46

标签: android android-layout android-listview android-sqlite android-cursoradapter

我有一个SQLite数据库,我使用ListView在主屏幕的SimpleCursorAdapter上显示。现在列表视图的每一行都应该有2个按钮,我还想在触摸TextView时弹出对话框。我应该怎么做呢?

我的主要课程是StartScreen,处理数据库相关内容的课程是Find

我已准备好所有功能(删除,同步,拨号等)。我只需要知道一种方法来正确地听取列表视图上的触摸。

StartScreen:

import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.SQLException;


public class StartScreen extends ActionBarActivity implements View.OnClickListener {



ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start_screen);
    Button b=(Button) findViewById(R.id.AddButton);

    b.setOnClickListener(this);
    lv=(ListView)findViewById(R.id.listview);

    try
    {
        populateListViewFromDatabase();
    } catch (Exception e)
    {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
    }
}

@Override
public void onResume()
{
    super.onResume();
    // put your code here...
    try
    {
        populateListViewFromDatabase();
    } catch (Exception e)
    {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
    }


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_start_screen, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View v) {

    switch (v.getId())
    {
        case R.id.AddButton:
            startActivity(new Intent(this,Form.class));
            break;

        default: break;
    }

}

public void populateListViewFromDatabase()throws Exception
{
    Find info=new Find(this);
    try
    {
        info.open();
        SimpleCursorAdapter myCursorAdapter=info.listUp();
        lv.setAdapter(myCursorAdapter);
        info.close();

    } catch (SQLException e)
    {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), "Oops there has been an error "+e.toString()+"", Toast.LENGTH_LONG).show();
    }
}   

}

查找:

import android.app.Dialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.SQLException;

public class Find
{ 
public static final String KEY_ROWID = "_id";
public static final String KEY_TIMESTAMP= "time_stamp";
public static final String KEY_IS_SYNCED = "sync";
public static final String KEY_NameOfCompany="name_of_company";

private static final String DATABASE_NAME = "FillUpFormsDB";
private static final String DATABASE_TABLE = "FillUpFormsTable";
private static final int DATABASE_VERSION = 1;

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;


private static class DbHelper extends SQLiteOpenHelper
{

    public DbHelper(Context context)
    {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        KEY_IS_SYNCED +" TEXT NOT NULL, " +
                        KEY_TIMESTAMP +" TEXT NOT NULL, " +
                        KEY_NameOfCompany+" TEXT NOT NULL); " 
        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
        onCreate(db);
    }

}

public Find(Context c)
{
    ourContext = c;
}


public Find open()throws SQLException
{
    ourHelper = new DbHelper(ourContext);
    ourDatabase=ourHelper.getWritableDatabase();
    return this;
}

public void close()
{
    ourHelper.close();
}


public long createEntry(String isSynced, String timeStamp, String nameOfCompany)
{
    ContentValues cv=new ContentValues();
    cv.put(KEY_IS_SYNCED,isSynced);
    cv.put(KEY_TIMESTAMP,timeStamp);
    cv.put(KEY_NameOfCompany,nameOfCompany);       

    return ourDatabase.insert(DATABASE_TABLE,null,cv);

}


public SimpleCursorAdapter listUp()
{

    String columns[]=new String[]{KEY_ROWID,KEY_TIMESTAMP,KEY_IS_SYNCED};
    Cursor c= ourDatabase.query(DATABASE_TABLE,columns,null,null,null,null,null);
    int toViewIDs[] = new int[]{R.id.rowno,R.id.timestamp,R.id.syncdetails};
    SimpleCursorAdapter CursorAdapter;
    CursorAdapter = new SimpleCursorAdapter(ourContext,R.layout.design_row,c,columns,toViewIDs,0);
    return CursorAdapter;
}

public String getTotalDetails(long row)
{
    String columns[]=new String[] {KEY_ROWID, KEY_IS_SYNCED, KEY_TIMESTAMP,KEY_NameOfCompany};
    String result="";        
    Cursor c= ourDatabase.query(DATABASE_TABLE,columns,KEY_ROWID+"="+row,null,null,null,null);
    if(c!=null)
    {
        c.moveToFirst();
        result="\nRecord No. : "+c.getString(0)+"\nSync Status:\n"+c.getString(1)+"\nTime of Creation:\n"+c.getString(2)+"\nName of Company:\n"+c.getString(3);
    }

return result;       
}



}

用于开始屏幕的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" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".StartScreen">

<Button
    android:elevation="15dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Add New"
    android:id="@+id/AddButton"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

    <ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/listview"
    android:layout_below="@+id/AddButton"
    android:layout_centerHorizontal="true"/>


</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="match_parent">

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Sync"
    android:id="@+id/buttonSync"/>

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Delete"
    android:id="@+id/buttonDelete"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:onClick="myClickHandler"
    android:id="@+id/rowno"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:onClick="myClickHandler"
    android:id="@+id/timestamp"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:onClick="myClickHandler"
    android:id="@+id/syncdetails"/>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

使用以下教程创建customadapter。在customadapter中创建一个包含所有视图的ViewHolder(在您的情况下为按钮和textview)。

public static class ViewHolder{
         public TextView text, text1;
         public Button btn1,btn2;     
     }

在customAdapter类的getView中,实例化ViewHolder并分配视图。

ViewHolder v=new ViewHolder();
holder.text = (TextView) vi.findViewById(R.id.rowno);
holder.text1=(TextView)vi.findViewById(R.id.timestamp);
holder.btn1=(ImageView)vi.findViewById(R.id.buttonSync);    
holder.btn2=(ImageView)vi.findViewById(R.id.buttonDelete);

然后调用onClicklistener并编写onClick方法需要完成的操作(不要忘记实现OnClickListener。

holder.btn1.setOnClickListener(this);

使用本教程获取更多详细信息。 http://androidexample.com/How_To_Create_A_Custom_Listview_-_Android_Example/index.php?view=article_discription&aid=67&aaid=9