how to get image view from grid layout to alert dialog - android

I have an array of images, and wanted to display image from it, to alert dialog when we click on grid item.
Here is my class:
mainactivity.java
package glassfibre.hospital2;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
public class MainActivity extends FragmentActivity
{
GridView grid;
String[] web = {
"Food",
"Doctor",
"Water",
"Feel Cold",
"Adjust Bed",
"Toilet"
} ;
int[] imageId = {
R.drawable.food,
R.drawable.doctor,
R.drawable.water2,
R.drawable.lowtemp,
R.drawable.bed,
R.drawable.toilet
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomGrid adapter = new CustomGrid(MainActivity.this, web, imageId);
grid=(GridView)findViewById(R.id.grid);
grid.setAdapter(adapter);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +web[+ position], Toast.LENGTH_SHORT).show();
mydialog dialog = new mydialog();
dialog.show(getSupportFragmentManager(),"my_dialog");
}
});
}
}
CustomGrid.java
package glassfibre.hospital2;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomGrid extends BaseAdapter{
private Context mContext;
private final String[] web;
final int[] Imageid;
public CustomGrid(Context c,String[] web,int[] Imageid ) {
mContext = c;
this.Imageid = Imageid;
this.web = web;
}
#Override
public int getCount() {
return web.length;
}
#Override
public Object getItem(int position) {
return null;
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_single, null);
TextView textView = (TextView) grid.findViewById(R.id.grid_text);
ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
textView.setText(web[position]);
imageView.setImageResource(Imageid[position]);
} else {
grid = (View) convertView;
}
return grid;
}
}
grid_single.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp" >
<ImageView
android:id="#+id/grid_image"
android:src="#drawable/food"
android:layout_width="150dp"
android:layout_height="150dp">
</ImageView>
<TextView
android:id="#+id/grid_text"
android:text="#string/food"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_below="#id/grid_image"
android:gravity="center"
android:textSize="20sp" >
</TextView>
</RelativeLayout>
mydialog.java
package glassfibre.hospital2;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import java.util.zip.Inflater;
import static android.R.attr.gridViewStyle;
import static android.R.attr.id;
import static android.R.attr.thumbPosition;
import static glassfibre.hospital2.R.layout.grid_single;
public class mydialog extends DialogFragment implements View.OnClickListener
{
Button bt;
ImageView iv;
CustomGrid cg;
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.my_dialog,null);
bt=(Button)view.findViewById(R.id.button);
bt.setOnClickListener(this);
iv= (ImageView) view.findViewById(R.id.imageView);
setCancelable(false);
AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
// > here i wanted to set image which i click on grid view
return view;
}
#Override
public void onClick(View view)
{
if(view.getId()==R.id.button)
{
dismiss();
}
}
}
my_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="I want"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="20dp"
android:id="#+id/textView3"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:gravity="center"
android:textSize="20dp"/>
<ImageView
android:layout_width="150dp"
android:layout_height="150dp"
app:srcCompat="#drawable/food"
android:id="#+id/imageView"
android:layout_marginTop="19dp"
android:layout_below="#+id/textView3"
android:layout_centerHorizontal="true" />
<Button
android:text="OK"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/imageView"
android:layout_centerHorizontal="true"
android:layout_marginTop="12dp"
android:id="#+id/button" />
</RelativeLayout>
I have an array of images, and wanted to display image from it, to alert dialog when we click on grid item.

Do something like this:
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +web[+ position], Toast.LENGTH_SHORT).show();
mydialog dialog = new mydialog();
int imageResource = imageId[position];
dialog.setImageResource(imageResource);
dialog.show(getSupportFragmentManager(),"my_dialog");
}
});
And in your mydialog class declare int variable
private int imageResource;
And create a method:
public void setImageResource(int imageResource) {
this.imageResource = imageResource;
}
now you can set image resource to imageview in onCreateView method of mydialog class

Inside your myDialog class,just have a setter method which stores the Drawable Resource id , like shown below
public void setImageIdToDisplay(int aDrawableId) {
mDrawableId = aDrawableId;
}
and in your oncreateview method of myDialog class, just set the image resource id to the imageview
iv.setImageResource(mDrawableId);
and in your MainActivity's onItemClick listner of gridview, pass the drawable resource id as shown below
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +web[+ position], Toast.LENGTH_SHORT).show();
mydialog dialog = new mydialog();
dialog.setImageIdToDisplay(imageId[position]);
dialog.show(getSupportFragmentManager(),"my_dialog");
}
});

Related

clickListener is not working in GridView in android app

I am implementing an android application that has a GridView where every item is an ImageView with TextView below, I implemented the adapter and the GridView displays correctly, but it is supposed that when I click an image an other screen (Activity is launched) but unfortunately it is not the case here is my code:
the gridView_layout:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
>
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/videosGrid"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:numColumns="auto_fit"
android:background="#000"
android:horizontalSpacing="10dp"
android:verticalSpacing="10dp"
android:columnWidth="120dp"
android:stretchMode="spacingWidthUniform"></GridView>
</GridLayout>
the grid_item_layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="#+id/video_thumbnail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:minWidth="170dp"
android:minHeight="140dp"
android:scaleType="fitXY"
android:clickable="true"/>
<!-- android:src="#drawable/alternative_rock_music" -->
<TextView android:id="#+id/video_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="5dp"
android:textColor="#color/red"
android:textStyle="bold"
/>
</LinearLayout>
the adapter:
package com.app.utils;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.app.R;
import com.app.entities.VideoEntity;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
public class MyGridViewAdapter extends BaseAdapter {
private static final String TAG = MyGridViewAdapter.class.getSimpleName();
private Context context;
private List<VideoEntity> videosList;
public MyGridViewAdapter(Context context) {
this.context = context;
}
#Override
public int getCount() {
return videosList.size();
}
#Override
public Object getItem(int position) {
return videosList.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
public List<VideoEntity> getVideosList() {
return videosList;
}
public void setVideosList(List<VideoEntity> videosList) {
this.videosList = videosList;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d(TAG," getView(int, View, viewGroup - Ini ");
View row = convertView;
ViewHolder holder = null;
if(row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.video_item ,parent, false);
holder = new ViewHolder(row);
row.setTag(holder);
}
else
{
holder = (ViewHolder) row.getTag();
}
VideoEntity tmp = videosList.get(position);
Picasso.with(context).load(tmp.getThumbnailURL()).into(holder.myVideo);
holder.title.setText(tmp.getTitle());
Log.d(TAG, " getView(int, View, viewGroup - Fi ");
return row;
}
class ViewHolder {
ImageView myVideo;
TextView title;
public ViewHolder(View v) {
Log.d(TAG," ViewHolder(View) - Ini ");
myVideo = (ImageView) v.findViewById(R.id.video_thumbnail);
title = (TextView) v.findViewById(R.id.video_title);
Log.d(TAG," ViewHolder(View) - Fi ");
}
}
}
and here is the activity where i am supposed to catch the click event on every item of the gridView:
package com.app.activities
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.GridView;
import com.app.entities.VideoEntity;
import com.app.utils.MyGridViewAdapter;
import java.util.ArrayList;
import static android.widget.AdapterView.*;
public class VideosCatalogActivity extends Activity implements AdapterView.OnItemSelectedListener, AdapterView.OnClickListener{
private static final String TAG = VideosCatalogActivity.class.getSimpleName();
private GridView videosGrid;
private ArrayList<VideoEntity> videosList;
#Override
protected void onCreate(Bundle savedInstanceState){
Log.d(TAG, " onCreate(Bundle) - Ini ");
super.onCreate(savedInstanceState);
setContentView(R.layout.videos_catalog_layout);
Bundle bundle = getIntent().getExtras();
videosList = bundle.getParcelableArrayList("com.app.entities.VideoEntity" );
videosGrid = (GridView) findViewById(R.id.videosGrid);
MyGridViewAdapter adapter = new MyGridViewAdapter(this);
adapter.setVideosList(videosList);
videosGrid.setAdapter(adapter);
videosGrid.setOnItemSelectedListener(this);
Log.d(TAG, " onCreate(Bundle) - Fi ");
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Ini ");
Intent intent = new Intent(getApplicationContext(),YoutubePlayerActivity.class);
intent.putExtra("VIDEO_ID",videosList.get(position).getId());
startActivity(intent);
Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Fi ");
}
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Ini ");
Intent intent = new Intent(getApplicationContext(),YoutubePlayerActivity.class);
intent.putExtra("VIDEO_ID",videosList.get(position).getId());
startActivity(intent);
Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Fi ");
}
#Override
public void onNothingSelected(AdapterView<?> parent) {
}
#Override
public void onClick(View v) {
}
/*#Override
public void onNothingSelected(AdapterView<?> parent) {
} */
}
I tried to implement two different onClickListeners methods but none is working.
I don't know what i did wrong ???
Any help will be very appreciated.
Note: i can confirm that it is not a manifest problem, because i debugged and nothing happens when i click an image.
Change
`implements AdapterView.OnItemSelectedListener, AdapterView.OnClickListener`
to
`implements AdapterView.OnItemClickListener`
Change
`videosGrid.setOnItemSelectedListener(this)`
to
`videosGrid.setOnItemClickListener(this)`
Remove android:clickable="true" in ImageView
Remove both interfaces
AdapterView.OnItemSelectedListener
AdapterView.OnClickListener and respective methods.
and implement the AdapterView.OnItemClickListener
You need to clarify that AdapterView.OnItemClickListener is different to AdapterView.OnItemSelectedListener and AdapterView.OnClickListener also.
Your activity should implement AdapterView.OnItemClickListener, override it and you will get item click event. Remember to add this line: videosGrid.setOnItemClickListener(this).

Error: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

I had created an usage adapter to bind my items. However, i dont why this error (Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference) shows when i run the application.
My adapter
package com.example.redir.wealthtrack;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import com.example.redir.wealthtrack.model.Receipt;
import com.example.redir.wealthtrack.model.Usage;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
/**
* Created by User on 2/3/2016.
*/
public class UsageAdapter extends ArrayAdapter<Usage> {
private static final String TAG = "Usage" ;
ArrayList<Usage> list;
Context context;
public static final String LOGTAG = "EXPLORECE";
public UsageAdapter(Context context, int resource, ArrayList<Usage> lists){
super(context, resource, lists);
this.context = context;
this.list = lists;
}
public View getView(int position, View convertView, ViewGroup parent) {
Usage myusage = list.get(position);
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.usage_item, null);
return view;
}
}
My fragment
package com.example.redir.wealthtrack;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.redir.wealthtrack.db.ReceiptsDataSource;
import com.example.redir.wealthtrack.db.UsageDataSource;
import com.example.redir.wealthtrack.model.Receipt;
import com.example.redir.wealthtrack.model.Usage;
import java.util.ArrayList;
import java.util.List;
/**
* A simple {#link Fragment} subclass.
*/
public class UsageFragment extends Fragment {
public UsageDataSource Usagedatasource;
ArrayAdapter<Usage> UsageAdapter;
ListView listView;
List<Usage> usages;
Usage selectedUsage;
public UsageFragment() {
// Required empty public constructor
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showToast(getActivity().getApplicationContext(), "Usage's history");
((MainActivity) getActivity()).setActionBarTitle("View Usage");
Usagedatasource = new UsageDataSource(getActivity().getApplicationContext());
Usagedatasource.open();
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_receipts, container, false);
usages = (List<Usage>) Usagedatasource.getAll();
UsageAdapter = new UsageAdapter(getActivity().getApplicationContext(),0, (ArrayList<Usage>) usages);
listView = (ListView) view.findViewById(R.id.listView3);
listView.setAdapter(UsageAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedUsage = usages.get(position);
AlertDialog.Builder a_builder = new AlertDialog.Builder(getActivity());
a_builder.setMessage("Receipt/Bill captured on: " + selectedUsage.getUsagedate())
.setCancelable(false)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog alert = a_builder.create();
alert.setTitle(Html.fromHtml("<font color='#08ae9e'>Information</font>"));
alert.show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
#Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
selectedUsage = usages.get(position);
AlertDialog.Builder a_builder = new AlertDialog.Builder(getActivity());
a_builder.setMessage("Are you sure you want to delete?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
deleteItem(selectedUsage);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alert = a_builder.create();
alert.setTitle(Html.fromHtml("<font color='#08ae9e'>Alert!!</font>"));
alert.show();
return true;
}
});
return view;
}
public static void showToast(Context context, String text) {
Toast.makeText(context, text, Toast.LENGTH_LONG).show();
}
private void deleteItem(Usage selectedUsage) {
Usagedatasource.removeUsage(selectedUsage);
showToast(getActivity().getApplicationContext(), "Usage deleted");
UsageAdapter.notifyDataSetChanged();
UsageAdapter.notifyDataSetInvalidated();
refreshDisplay();
}
private void refreshDisplay() {
usages = Usagedatasource.getAll();
UsageAdapter.clear();
UsageAdapter.addAll(usages);
}
}
My item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="#+id/textView2"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="70dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="#+id/textView3"
android:layout_below="#+id/textView2"
android:layout_centerHorizontal="true"
android:layout_marginTop="57dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="#+id/textView4"
android:layout_centerVertical="true"
android:layout_alignStart="#+id/textView3" />
</RelativeLayout>
//receipts fragment
<LinearLayout 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"
tools:context=".ReceiptFragment"
android:weightSum="1">
<!-- TODO: Update blank fragment layout -->
<GridView
android:layout_width="wrap_content"
android:layout_height="503dp"
android:id="#+id/gridView"
android:numColumns="auto_fit"
android:horizontalSpacing="5dp"
android:columnWidth="120dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="70dp"
android:padding="8dp"
/>
</LinearLayout>
//My usage database(getALL method)
public List<Usage> getAll() {
List<Usage> usages = new ArrayList<Usage>();
Cursor cursor = database.query(WealthDBOpenHelper.TABLE_USAGE, allColumns,
null, null, null, null, null);
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
Usage usage = new Usage();
usage.setUsagedate(cursor.getString(cursor.getColumnIndex(WealthDBOpenHelper.COLUMN_USAGE_DATE)));
usage.setAmount(cursor.getDouble(cursor.getColumnIndex(WealthDBOpenHelper.COLUMN_AMOUNT)));
usage.setCategory(cursor.getString(cursor.getColumnIndex(WealthDBOpenHelper.COLUMN_CATEGORY)));
usages.add(usage);
}
}
return usages;
}
You are using a GridView not ListView, also id you are using is wrong.
Change like this
GridView gridView;
gridView = (GridView) view.findViewById(R.id.gridView);
gridView.setAdapter(UsageAdapter);
In xml change
tools:context=".UsageFragment"

How to add Listeners of Dynamic Check Boxes in Simple Adapter

I have dynamic CheckBoxes and now I want to check which CheckBox clicked or not
AdditionalInformation.Java File Here Simple Adapter is defined :
package com.example.ahmad.cvbuilder21;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class AdditionalInformation extends ActionBarActivity {
CheckBox cb;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_additional_infromation);
cb=(CheckBox)findViewById(R.id.additionalchk);
ABC s = ABC.getSingletonObject();
String[][] str = s.getString();
ListView lv=((ListView)findViewById(R.id.additionallist));
String[] additionalOptions={"Add your Picture","Add Experince / Project","Add Reference","Add Skills / Languages"};
String[] txtViewNames={"options"};
List<HashMap<String,String>>list=new ArrayList<HashMap<String, String>>();
for (int i = 0; i < additionalOptions.length; i++) {
HashMap<String, String> map= new HashMap<String, String>();
map.put("options", additionalOptions[i]);
list.add(map);
}
SimpleAdapter simpleAdpt = new SimpleAdapter(this, list, R.layout.mylayout2,txtViewNames , new int[] {R.id.additionaltxt1});
lv.setAdapter(simpleAdpt);
}
public void additionalData(View view1)
{
if(cb.isChecked())
{
cb.findViewById(R.id.additionalchk).setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View view)
{
Toast toast = Toast.makeText(getApplicationContext(), "Checked",
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
toast.show();
}
}
);
}
else{}
}
}
AdditionalInformation.xml file: where additionalData function is called to
check which CheckBox clicked.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Choose Additional Options:"
android:id="#+id/additionalBtn"
/>
<ListView
android:layout_below="#id/additionalBtn"
android:layout_centerHorizontal="true"
android:id="#+id/additionallist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></ListView>
<Button
android:layout_below="#id/additionallist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add to CV"
android:onClick="additionalData"
/>
</RelativeLayout>
mylayout2.xml file where I define the controls for simple adapter:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:layout_alignParentLeft="true"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="#+id/additionaltxt1"
/>
<CheckBox
android:layout_alignParentRight="true"
android:layout_alignRight="#id/additionaltxt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:id="#+id/additionalchk"
/>
</RelativeLayout>
What you actually need to do is create a custom adapter. In that custom you could listen for checkbox event at the right position.
Here is an example:
public class ListEmployeesAdapter extends BaseAdapter {
public List<Employees> items;
Context c;
public ListEmployeesAdapter(Context c, List<Employees> items) {
this.c = c;
this.items = items;
}
#Override
public int getCount() {
return items.size();
}
#Override
public Object getItem(int position) {
return items.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
c.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.employee_item, null);
}
TextView name = (TextView) convertView.findViewById(R.id.name);
name.setText(items.get(position).name);
name.setOnCLickListener(new OnClickListener(){
#Override
public void onClick(){
//listen to the click
}
});
return convertView;
}
}
Just replace the the layout with you layout and call checkbox instead of TextView and you are good to go.

Custom ListView not showing any items

I am trying to display a custom listview but nothing appears.
My activity:
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import com.example.elnoorgeh.ServerAPI;
import android.app.Fragment;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView.FindListener;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class BlogFragment extends Fragment {
JSONArray jArray;
TextView title;
RelativeLayout layout;
int previousID = 0;
int currentID = 0;
ArrayList<String> titles;
ArrayList<String> contents;
ListView list;
public BlogFragment() {
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_blog, container,
false);
new AsyncFetch().execute();
return rootView;
}
private class AsyncFetch extends AsyncTask<Object, Object, Object> {
#Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
jArray = new JSONArray();
jArray = ServerAPI.getData();
titles = new ArrayList<String>();
contents = new ArrayList<String>();
for (int i = 0; i < jArray.length(); i++) {
String blogTitle = null;
String content = null;
try {
blogTitle = jArray.getJSONObject(i).getString("title");
content = jArray.getJSONObject(i).getString("content");
titles.add(blogTitle);
contents.add(content);
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(blogTitle);
System.out.println(content);
}
// display(titles, contents);
return null;
}
protected void onPostExecute(Object result) {
layout = (RelativeLayout) getView().findViewById(R.id.blogPage);
layout.removeAllViews();
CustomList adapter = new CustomList(getActivity(), titles);
list = new ListView(getActivity());
System.out.println("list done");
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getActivity(),
"You Clicked at " + titles.get(position),
Toast.LENGTH_SHORT).show();
}
});
}
}
public void display(ArrayList<String> t, ArrayList<String> c) {
}
}
Custom ListView class:
import java.util.ArrayList;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomList extends ArrayAdapter<String> {
private final Activity context;
private final ArrayList<String> web;
// private final Integer[] imageId;
public CustomList(Activity context, ArrayList<String>web) {
super(context, R.layout.fragment_listview);
this.context = context;
this.web = web;
// this.imageId = imageId;
}
#Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.fragment_listview, null, true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);
ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
txtTitle.setText((CharSequence) web.get(position));
// imageView.setImageResource(imageId[position]);
return rowView;
}
}
fragment_blog:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/blogPage"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="#+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
<TextView
android:id="#+id/txtLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:maxLines="20"
android:singleLine="false"
android:textSize="16dp" />
</RelativeLayout>
fragment_listview:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TableRow>
<ImageView
android:id="#+id/img"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:id="#+id/txt"
android:layout_width="wrap_content"
android:layout_height="50dp" />
</TableRow>
</TableLayout>
I can't find any errors or notice something irregular, so why is that happening?
you should extend BaseAdapter and implement abstract methods
#Override
public int getCount() {
return web.size();
}
#Override
public Object getItem(int position) {
return web.get(position);
}
#Override
public long getItemId(int position) {
return 0;
}
also you might change
txtTitle.setText((CharSequence) web.get(position));
to
txtTitle.setText((CharSequence) getItem(position));
now your adapter don't know size of web array
edit:
you can get one inflater in constructor and keep in class, no need to getting inflater each time (little bit better for perfomance)
LayoutInflater inflater = context.getLayoutInflater();
edit 2:
localhost put proper comment - you are removing all Views from RelativeLayout, also ListView, and creating new ListView without adding to Relative. keeping reference will not auto-add View
protected void onPostExecute(Object result) {
layout = (RelativeLayout) getView().findViewById(R.id.blogPage);
layout.removeView(getView().findViewById(R.id.txtLabel);
//assuming you need to remove only txtLabel
CustomList adapter = new CustomList(getActivity(), titles);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getActivity(),
"You Clicked at " + titles.get(position),
Toast.LENGTH_SHORT).show();
}
});
}

set a listener for widgets in items of a listview

I meet a problem developing an android project.
Using adapter, I place many items in a ListView, and there is an ImageButton in each item. Now I want to set a click listener for these ImageButtons. What should I do?
This achieves your desired result. Its functionality is the button itself has a click response different from the container, which also has a response.
MainActivity.java
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
ListView lv = (ListView) findViewById( R.id.list );
lv.setOnItemClickListener(
new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0,
android.view.View arg1, int arg2, long arg3) {
Toast.makeText( MainActivity.this,
"List item clicked",
Toast.LENGTH_SHORT).show();
}
});
ArrayList<String> items = new ArrayList<String>();
items.add( "item1");
items.add( "item2");
items.add( "item3");
ListAdapter adapter = new ListAdapter( this, items);
lv.setAdapter( adapter );
}
}
ListAdapter.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.BaseAdapter;
import android.widget.Toast;
import java.util.List;
public class ListAdapter extends BaseAdapter {
public ListAdapter(Context context,
List<String> items ) {
inflater = LayoutInflater.from( context );
this.context = context;
this.items = items;
}
public int getCount() {
return items.size();
}
public Object getItem(int position) {
return items.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
String item = items.get(position);
View v = null;
if( convertView != null )
v = convertView;
else
v = inflater.inflate( R.layout.item, parent, false);
TextView itemTV = (TextView)v.findViewById( R.id.item);
itemTV.setText( item );
ImageButton button =
(ImageButton)v.findViewById( R.id.button);
button.setOnClickListener(
new OnClickListener() {
public void onClick(View v) {
Toast.makeText( context,
"ImageButton clicked",
Toast.LENGTH_SHORT).show();
}
});
return v;
}
private Context context;
private List<String> items;
private LayoutInflater inflater;
}
item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants" >
<TextView
android:id="#+id/item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:textSize="28sp" />
<ImageButton
android:id="#+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="#android:color/transparent"
android:src="#drawable/emo_im_cool" />
</RelativeLayout>
list.xml
<?xml version="1.0" encoding="utf-8" ?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="#+id/list" />
Try it out and hopefully you can see what's going on to learn what you need

Categories

Resources