0

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> 

답변

0

customadapter를 만들려면 아래 자습서를 사용하십시오. customadapter에서 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를 구현하는 http://androidexample.com/How_To_Create_A_Custom_Listview_-_Android_Example/index.php?view=article_discription&aid=67&aaid=9

+0

holder.btn1.setOnClickListener(this); 

를 사용하여 더 자세한 내용은이 튜토리얼을 잊고 무엇을해야 해달라고 버튼을 클릭 한 행의 ROWID를 얻으시겠습니까? 감사합니다! –

+0

전체 행이 선형 레이아웃이므로 레이아웃에 ID를 할당하지 않고> android : id = "@ + id/AddButton"을 LinearLayout. 나중에 ca. 마찬가지로 Onclicklistener는 버튼에 대해 수행합니다. – Psypher

+0

rowid는 행과 연관된 sqlite 데이터베이스 행의 id (_id)와 동일합니다. 클릭 할 때 얻을 수있는 방법이 있습니까? :) 고마워요. –