There are several points i wanna to provide here:
each item of listview consists an imageButton,2 TextView and 1 imageView
I want to get the imageButton of the itemView in the activity via position rather than the click event because i wanna add a badgeView to the imageButton
The error information is as listed:
--------------------error information----------------
03-04 07:03:07.226: D/dalvikvm(712): GC_CONCURRENT freed 48K, 3% free 10270K/10503K, paused 8ms+7ms
03-04 07:03:07.816: D/gralloc_goldfish(712): Emulator without GPU emulation detected.
03-04 07:03:17.307: D/AndroidRuntime(712): Shutting down VM
03-04 07:03:17.307: W/dalvikvm(712): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
03-04 07:03:17.366: E/AndroidRuntime(712): FATAL EXCEPTION: main
03-04 07:03:17.366: E/AndroidRuntime(712): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.list_1/com.example.list_1.ClinicMessage}: java.lang.NullPointerException
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.ActivityThread.access$600(ActivityThread.java:122)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.os.Looper.loop(Looper.java:137)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.ActivityThread.main(ActivityThread.java:4340)
03-04 07:03:17.366: E/AndroidRuntime(712): at java.lang.reflect.Method.invokeNative(Native Method)
03-04 07:03:17.366: E/AndroidRuntime(712): at java.lang.reflect.Method.invoke(Method.java:511)
03-04 07:03:17.366: E/AndroidRuntime(712): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-04 07:03:17.366: E/AndroidRuntime(712): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-04 07:03:17.366: E/AndroidRuntime(712): at dalvik.system.NativeStart.main(Native Method)
03-04 07:03:17.366: E/AndroidRuntime(712): Caused by: java.lang.NullPointerException
**03-04 07:03:17.366: E/AndroidRuntime(712): at com.example.list_1.ClinicMessage.getViewByPosition(ClinicMessage.java:122)
03-04 07:03:17.366: E/AndroidRuntime(712): at com.example.list_1.ClinicMessage.AddBadgeView(ClinicMessage.java:104)**
03-04 07:03:17.366: E/AndroidRuntime(712): at com.example.list_1.ClinicMessage.onCreate(ClinicMessage.java:49)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.Activity.performCreate(Activity.java:4465)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-04 07:03:17.366: E/AndroidRuntime(712): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
03-04 07:03:17.366: E/AndroidRuntime(712): ... 11 more
03-04 07:03:19.176: I/Process(712): Sending signal. PID: 712 SIG: 9
--------------------My Code--------------------------
public class ClinicMessage extends Activity {
List<HashMap<String,Object>> mList= new ArrayList();
HashMap<String,Object> map=new HashMap();
private ListView mListView;
private ImageButton mIBBack;
private ImageButton mIBWrite;
private ImageButton imageButtonWithBadge;
MyBaseAdapter mBaseAdapter;
private ActionBar actionbar;
private BadgeView badge;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.list1_clinic_message);
actionbar=getActionBar();
actionbar.hide();
initComponent();
initList();
**AddBadgeView();**
dealWithTitleBarEvents();
dealWithListEvents();
}
public void initComponent()
{
mListView=(ListView)findViewById(R.id.lvClinicMessage);
mIBBack=(ImageButton)findViewById(R.id.ibBack);
mIBWrite=(ImageButton)findViewById(R.id.ibWrite);
}
public void initList()
{
for(int i=0;i<8;i++)
{
map.put("ItemLeftPic",getResources().getDrawable(R.drawable.ib_cmsg_left));
map.put("ItemNext", getResources().getDrawable(R.drawable.im_arrow));
map.put("ItemTitle", "上海怡康家园");
map.put("ItemText", "医生你好,本周有空吗");
map.put("ItemTime", "14/12/14 17:30");
mList.add(map);
}
Toast.makeText(ClinicMessage.this, mList.size()+"项",Toast.LENGTH_LONG).show();
}
public void AddBadgeView()
{
**View view=getViewByPosition(0, mListView);**
ImageButton imageButtonWithBadge=(ImageButton) view.findViewById(R.id.ibClinicMessageLeft);
badge=new BadgeView(this, imageButtonWithBadge);
badge.setText(5);
badge.setBadgePosition(BadgeView.POSITION_TOP_RIGHT);
badge.show();
}
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
thanks for helping me T^T
-------------------------added info-------------
perhaps i didn't put the whole code in ,but i did initialize the listView by setAdapter (you can see it in the dealWithListEvents()function and the call in oncreate().).here is the dealWithListEvents():
public void dealWithListEvents()
{
mBaseAdapter=new MyBaseAdapter(mList, this);
mListView.setAdapter(mBaseAdapter);
mListView.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View arg1, int position,long id)
{
Toast.makeText(ClinicMessage.this, "你点击了第"+position+"项",Toast.LENGTH_LONG).show();
}
});
}
-----------------the MyBaseAdapter---------------------
package com.example.list_1;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
public class MyBaseAdapter extends BaseAdapter {
private LayoutInflater mInflater; //得到一个LayoutInfalter对象用来导入布局
private List<HashMap<String,Object>>mList;
class ViewHolder
{
private ImageButton ibLeftPic;
private TextView tvTitle;
private TextView tvText;
private TextView tvTime;
private ImageView ivNext;
}
public MyBaseAdapter(List<HashMap<String,Object>> list,Context context) {
this.mInflater=LayoutInflater.from(context);
this.mList=list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewholder;
//convertView就是由于滑动被隐藏回收的ItemView
//viewHolder就是一个来接收它的缓存
if(convertView==null)
{
convertView=mInflater.inflate(R.layout.list1_listitem_clinicmessage, null);
viewholder=new ViewHolder();
viewholder.ibLeftPic=(ImageButton)convertView.findViewById(R.id.ibClinicMessageLeft);
viewholder.ivNext=(ImageView)convertView.findViewById(R.id.ivItemArrow);
viewholder.tvTitle=(TextView)convertView.findViewById(R.id.tvClinicMessagetTitle);
viewholder.tvText=(TextView)convertView.findViewById(R.id.tvClinicMessageText);
viewholder.tvTime=(TextView)convertView.findViewById(R.id.tvClinicMessageTime);
convertView.setTag(viewholder);
}
else
{
viewholder=(ViewHolder)convertView.getTag();
}
viewholder.ibLeftPic.setBackgroundDrawable((Drawable) mList.get(position).get("ItemLeftPic"));
viewholder.ibLeftPic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
viewholder.ivNext.setImageDrawable((Drawable)
mList.get(position).get("ItemNext"));
viewholder.tvTitle.setText(mList.get(position).get("ItemTitle").toString());
viewholder.tvText.setText(mList.get(position).get("ItemText").toString());
` `viewholder.tvTime.setText(mList.get(position).get("ItemTime").toString());`
return convertView;
}
public void refresh(List<HashMap<String,Object>> list)
{
list=mList;
notifyDataSetChanged();
}
}