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

Android 定义按TextView和ListView中的按钮时的操作,android,android-layout,android-listview,android-sqlite,android-cursoradapter,Android,Android Layout,Android Listview,Android Sqlite,Android Cursoradapter,我有一个SQLite数据库,我使用SimpleCursorAdapter将其显示在主屏幕的ListView上。现在列表视图的每一行应该有2个按钮,我还想弹出一个关于触摸文本视图的对话框。我该怎么做 我的主要类是StartScreen,处理数据库相关内容的类是Find 我已经准备好删除、同步、拨号等所有功能。我只需要知道一种方法,以正确地听取触摸列表视图 StartScreen: import android.app.Dialog; import android.content.Intent; i

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

我的主要类是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>

使用以下教程创建customadapter。在customadapter中,创建一个包含案例中所有viewsbuttons和textview的ViewHolder

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);
有关详细信息,请使用本教程。

要获取单击按钮所在行的ROWID,我应该怎么做?谢谢整行是一个linearlayout,您尚未为布局分配id,只需在linearlayout中添加>android:id=@+id/AddButton即可。稍后调用Onclicklistener,类似于对button.rowid执行的操作,如在与该行关联的sqlite数据库行的id_id中所做的操作。有没有一种方法可以在点击时实现这一点?非常感谢:不是数据库的id…我是说给线性布局分配一个id…android:id=@+id/row\u linear\u layout然后在viewholder中添加LinearLayout lv,然后在getview中添加holder.lv=LinearLayoutvi.findViewByIdR.id.row\u linear\u layout,并在lv上调用onclicklistener,用您想要执行的操作实现onClick