Reputation: 211
Beginner here.
I am using CursorAdapter
and ListView
. I have two buttons per row(item?). I would like to add click listener to them such that I can hide/show the TextViews
it the same row.
Here is my Adapter:
public class ToDoCursorAdapter extends CursorAdapter {
public ToDoCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
// The newView method is used to inflate a new view and return it,
// you don't bind any data to the view at this point.
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.listview, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView engText = (TextView) view.findViewById(R.id.engText);
TextView arabText = (TextView) view.findViewById(R.id.arabText);
TextView refText = (TextView) view.findViewById(R.id.refText);
String arabic = cursor.getString(cursor.getColumnIndexOrThrow("PlainArab_Text"));
String english = cursor.getString(cursor.getColumnIndexOrThrow("PlainEng_Text"));
String ref = cursor.getString(cursor.getColumnIndexOrThrow("REF"));
arabText.setText(arabic);
engText.setText(english);
refText.setText(ref);
}
}
Adapter xml:
<?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"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button"
android:layout_width="0sp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text="Left Button"
/>
<Button
android:id="@+id/button2"
android:layout_width="0sp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text="Right Button"
/>
</LinearLayout>
<TextView
android:id="@+id/engText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10sp"
android:textSize="15sp"
android:typeface="serif"/>
<TextView
android:id="@+id/arabText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10sp"
android:textSize="15sp"
android:typeface="sans"
/>
<TextView
android:id="@+id/refText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10sp"
android:textSize="15sp" />
</LinearLayout>
Activity code:
public class ListViewActivity extends Activity {
ListView listView ;
private SQLiteDatabase hadlistDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
DatabaseHelper1 hadlistDBHelper;
hadlistDBHelper = new DatabaseHelper1(this);
try {
hadlistDBHelper.createDataBase();
}
catch (IOException ioe)
{
throw new Error("Unable to create database");
}
hadlistDB = hadlistDBHelper.openDataBase();
Cursor todoCursor = hadlistDB.rawQuery("SELECT ID as _id, * FROM HAD_TABLE WHERE ID < 5 ", null);
// Find ListView to populate
ListView lvItems = (ListView) findViewById(R.id.list);
// Setup cursor adapter using cursor from last step
ToDoCursorAdapter todoAdapter = new ToDoCursorAdapter(this, todoCursor);
// Attach cursor adapter to the ListView
lvItems.setAdapter(todoAdapter);
todoAdapter.changeCursor(todoCursor);
}
}
Activity xml:
<?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"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Top1" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Top2" />
</LinearLayout>
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
How do I add the listeners to the buttons in adapter xml?
Upvotes: 1
Views: 1546
Reputation: 2580
Create a button Object on the bindView method you have overridden on the ToDoCursorAdapter
class then use the findViewById like you use for the the rest of the text view to initialize the object, After which you need to add an onClickListner to do what you have intended on the code (ie. like hiding the textView)
public class ToDoCursorAdapter extends CursorAdapter {
public ToDoCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
// The newView method is used to inflate a new view and return it,
// you don't bind any data to the view at this point.
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.listview, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView engText = (TextView) view.findViewById(R.id.engText);
TextView arabText = (TextView) view.findViewById(R.id.arabText);
TextView refText = (TextView) view.findViewById(R.id.refText);
TextView refText = (TextView) view.findViewById(R.id.refText);
Button button = (Button) view.findViewById(R.id.button);
Button button2 = (Button) view.findViewById(R.id.button2);
String arabic = cursor.getString(cursor.getColumnIndexOrThrow("PlainArab_Text"));
String english = cursor.getString(cursor.getColumnIndexOrThrow("PlainEng_Text"));
String ref = cursor.getString(cursor.getColumnIndexOrThrow("REF"));
arabText.setText(arabic);
engText.setText(english);
refText.setText(ref);
//updated
arabText.setVisibility(View.VISIBLE);
engText.setVisibility(View.VISIBLE);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v){
arabText.setVisibility(View.GONE);
}
});
button2.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v){
engText.setVisibility(View.GONE);
}
});
}
}
Upvotes: 2
Reputation: 73
In your bindView()
method create Button
objects and add click listeners to them
@Override public void bindView(View view, Context context, Cursor cursor) {
Button button= (Button) findViewById(R.id.buttonId); button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
//your code here
}
});
}
Upvotes: 0
Reputation: 2076
Create a Callback interface
public interface ButtonCallback{
void onClickButton(View v);
void onClickButton2(View v);
}
Your MainActivity implements the Callback interface
public class ListViewActivity extends Activity implements ButtonCallback{
....
public void onClickButton(View v){
// do something
}
public void onClickButton2(View v){
// do something
}
}
In your Adapter, set the onclicklistener
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView engText = (TextView) view.findViewById(R.id.engText);
TextView arabText = (TextView) view.findViewById(R.id.arabText);
TextView refText = (TextView) view.findViewById(R.id.refText);
Button button = (TextView) view.findViewById(R.id.button);
Button button2 = (TextView) view.findViewById(R.id.button2);
String arabic = cursor.getString(cursor.getColumnIndexOrThrow("PlainArab_Text"));
String english = cursor.getString(cursor.getColumnIndexOrThrow("PlainEng_Text"));
String ref = cursor.getString(cursor.getColumnIndexOrThrow("REF"));
arabText.setText(arabic);
engText.setText(english);
refText.setText(ref);
button.setOnClickListenter(new View.OnClickListener({
public void onCLick(View v){
context.OnClickButton(v);
}
});
button2.setOnClickListenter(new View.OnClickListener({
public void onCLick(View v){
context.OnClickButton2(v);
}
});
}
Upvotes: 0