SimpleCursorAdapter
을 사용하여 메인 화면의 ListView
에 표시되는 SQLite 데이터베이스가 있습니다. 이제 목록보기의 각 행에는 2 개의 버튼이 있어야하며 TextView
을 터치하는 대화 상자가 나타납니다. 이 문제를 어떻게 해결해야합니까?ListView에서 TextView 및 버튼을 눌렀을 때의 동작 정의
내 주류는 StartScreen
이고 데이터베이스 관련 항목을 처리하는 클래스는 Find
입니다.
나는 모든 기능 (삭제, 동기화, dialouge 등)을 준비했습니다. 목록보기에서 제대로들을 수있는 방법을 알아야합니다.
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>
을
를 사용하여 더 자세한 내용은이 튜토리얼을 잊고 무엇을해야 해달라고 버튼을 클릭 한 행의 ROWID를 얻으시겠습니까? 감사합니다! –
전체 행이 선형 레이아웃이므로 레이아웃에 ID를 할당하지 않고> android : id = "@ + id/AddButton"을 LinearLayout. 나중에 ca. 마찬가지로 Onclicklistener는 버튼에 대해 수행합니다. – Psypher
rowid는 행과 연관된 sqlite 데이터베이스 행의 id (_id)와 동일합니다. 클릭 할 때 얻을 수있는 방법이 있습니까? :) 고마워요. –